Как выбрать id с максимальной группой дат по категориям в PostgreSQL?
например, я хотел бы выбрать id с максимальной группой дат по категориям, результат: 7, 2, 6
id category date
1 a 2013-01-01
2 b 2013-01-03
3 c 2013-01-02
4 a 2013-01-02
5 b 2013-01-02
6 c 2013-01-03
7 a 2013-01-03
8 b 2013-01-01
9 c 2013-01-01
могу ли я знать, как это сделать в PostgreSQL?
4 ответа:
это идеальный прецедент для
DISTINCT ON
(Постгрес специфическое расширение стандартаDISTINCT
):SELECT DISTINCT ON (category) id -- , category, date -- add any other column (expression) from the same row FROM tbl ORDER BY category, "date" DESC;
осторожно с нисходящим порядком сортировки. Если столбец может быть NULL, вы можете добавить
NULLS LAST
:
DISTINCT ON
это просто и быстро. Подробное объяснение в этом соответствующем ответе:для больших таблиц рассмотрим этот альтернативный подход:
оптимизация производительности много строк на
category
:
попробуй это:
SELECT * FROM Table1 t1 JOIN ( SELECT category, MAX(date) AS MAXDATE FROM Table1 GROUP BY category ) t2 ON T1.category = t2.category AND t1.date = t2.MAXDATE
посмотреть это SQLFiddle
другой подход заключается в использовании
first_value
функция окна: http://sqlfiddle.com/#!12/7a145/14SELECT DISTINCT first_value("id") OVER (PARTITION BY "category" ORDER BY "date" DESC) FROM Table1 ORDER BY 1;
... хотя я подозреваю, что предложение hims056 обычно будет работать лучше, когда присутствуют соответствующие индексы.
третье решение-это:
SELECT id FROM ( SELECT id, row_number() OVER (PARTITION BY "category" ORDER BY "date" DESC) AS rownum FROM Table1 ) x WHERE rownum = 1;