Я проектирую корзину покупок. Чтобы обойти проблему старых счетов-фактур, показывающих неточную цену после изменения цены продукта, я переместил поле цены из таблицы Product в таблицу ProductPrice, которая состоит из 3 полей, pid, даты и цены. pid и date образуют первичный ключ для таблицы. Вот пример того, что таблица выглядит следующим образом:SQL "GROUP BY" issue
pid date price
1 1/1/09 50
1 2/1/09 55
1 3/1/09 54
Использование SELECT
и GROUP BY
найти самую последнюю цену каждого продукта, я придумал:
SELECT pid, price, max(date) FROM ProductPrice GROUP BY pid
Дата и Pid вернулись, были точны. Я получил ровно 1 запись за каждый уникальный pid, и дата, которая сопровождала его, была последней датой для этого pid. Однако неожиданным было то, что цена вернулась. Он возвратил цену первой строки сопоставления PID, который в этом случае был 50.
После переделки моего заявления, я пришел с этим:
SELECT pp.pid, pp.price, pp.date FROM ProductPrice AS pp
INNER JOIN (
SELECT pid AS lastPid, max(date) AS lastDate FROM ProductPrice GROUP BY pid
) AS m
ON pp.pid = lastPid AND pp.date = lastDate
Хотя переработано утверждение дает теперь правильную цену (54), кажется невероятным, что для такого простого звукового запроса потребуется выполнить внутреннее соединение. Мой вопрос в том, является ли мое второе заявление самым простым способом выполнить то, что мне нужно сделать? Или я чего-то не хватает? Заранее спасибо!
Джеймс
Простой, хотя и на Postgresql: SELECT DISTINCT ON (pid) pid, date, price FROM ProductPrice ORDER BY pid, date DESC –