Получить самую новую запись перед ГРУППОЙ ПО запросу

#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