#sql #postgresql
#sql #postgresql
Вопрос:
Используя postgres, я хотел бы получить все разные пакеты, но получить самый последний пакет для каждой группы.
Например, у меня есть эта таблица с именем products:
package_name price date
- | 52500.0 | 20080910
- | 52900.0 | 20090422
- | 52900.0 | 20090706
ELITE PACKAGE | 62200.0 | 20080910
ELITE PACKAGE | 62500.0 | 20090706
ELITE PACKAGE | 62500.0 | 20090422
TECH PACKAGE | 57200.0 | 20080910
TECH PACKAGE | 58200.0 | 20090706
TECH PACKAGE | 58200.0 | 20090422
И я хотел бы получить следующий результат с помощью SQL-запроса:
- | 52900.0 | 20090706
ELITE PACKAGE | 62500.0 | 20090706
TECH PACKAGE | 58200.0 | 20090706
Я попробовал пару вещей, которые (я думаю) сработали бы в MySQL, но я не могу сделать это правильно для postgres.
Возможно ли это что-то сделать, и как бы я это сделал?
Спасибо,
Стефани
Ответ №1:
Другой вариант, который позволяет избежать самосоединения (я всегда ненавижу самосоединения)
SELECT package_name,price,date FROM
(
SELECT package_name,price,date,
ROW_NUMBER() OVER (PARTITION BY package_name ORDER BY date DESC) as rw
FROM products
) a
WHERE rw=1;
Комментарии:
1. И если бы эффективность была огромной проблемой, я полагаю, вы могли бы создать агрегатор, который мог бы выполнять это за один проход.
Ответ №2:
SELECT t.package_name, p.price, t.MaxDate
FROM (SELECT package_name, MAX(date) AS MaxDate
FROM products
GROUP BY package_name) t
INNER JOIN products p
ON t.package_name = p.package_name
and t.MaxDate = p.date