2010-02-05 1 views
3

Можно создать дубликат:
Retrieving the last record in each groupВыбор последней в каждой группе элементов

у меня есть 2 таблицы продуктов и стоимостью

ПРОДУКТ

ProdCode - PK 
ProdName 

COST

Effectivedate - PK 
RetailCOst 
Prodcode 

я попробовал этот запрос:

SELECT a.ProdCOde AS id, MAX(EffectiveDate) AS edate, RetailCOst AS retail 
FROM cost a 
INNER JOIN product b USING (ProdCode) 
WHERE EffectiveDate <= '2009-10-01' 
GROUP BY a.ProdCode; 

ммм й его показ правильного effectivedate, но стоимость на этом конкретный матче effectivedate оленьей кожи.

поэтому я хочу выбрать самую последнюю дату с соответствующей стоимостью за элемент.

, например дата я выбран «2009-12-25» и записи для 1 пункта являются следующие:

ProdCode |EffectiveDate| Cost 
00010000 | 2009-01-05 | 50 
00010000 | 2009-05-25 | 48 
00010000 | 2010-07-01 | 40 

так что в итоге я должен получить 00010000|2009-05-25|48, потому что это меньше, чем дата на мой запрос, и он является последним для этого элемента. и затем я хочу показать по моему запросу последние затраты на каждый продукт.

надеюсь услышать от вас в ближайшее время! благодаря!

ответ

2

Вы должны использовать подзапрос здесь:

SELECT maxdates.ProdCode, maxdates.maxDate, cost.RetailCost as retail 
    SELECT ProdCode, max(EffectiveDate) as maxDate 
    FROM cost 
    WHERE EffectiveDate < '2009-10-01' 
    GROUP BY ProdCode 
) maxdates 
LEFT JOIN cost ON (maxdates.ProdCode=cost.ProdCode 
       AND maxdates.maxDate=cost.EffectiveDate) 

Объяснение: Внутренний SELECT дает список всех продуктов и их соответствующих максимальных EffectiveDates. Соединение «склеивает» розничную стоимость за ввод данных в результат.

+0

спасибо! Я уже использовал его в своих запросах! – QWERTY

1

В качестве альтернативы, используя старый макс concat трюк, следует сделать трюк.

SELECT 
    p.ProdCode, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 1, 10) AS date, 
    SUBSTRING(MAX(CONCAT(d.EffectiveDate, c.RetailCost)), 10, 100) + 0 AS cost 
FROM 
    product p, 
    cost  c 
WHERE 
    p.ProdCode = c.ProdCode AND 
    c.EffectiveDate < '2009-10-01' 
GROUP BY 
    p.ProdCode 

 Смежные вопросы

  • Нет связанных вопросов^_^