Как выбрать 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 55

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/14

SELECT 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;

выберите id из группы tbl по cat, имеющей MAX (date)