Извлекать последние записи даты с помощью group by

#sql #postgresql #datetime #sql-order-by #greatest-n-per-group

#sql #postgresql #дата-время #sql-упорядочение по #наибольшее число записей на группу

Вопрос:

Я пытаюсь получить записи с последними записями с уникальными идентификаторами report_ids (col_1_0_). Можно сгруппировать по col_1_0_ и получить последнюю запись этой группы, используя временную метку этого столбца col_10_0_.

Я попытался выполнить поиск на этом форуме, чтобы найти способ, но у меня это не сработало. Будет полезно, если кто-нибудь поможет мне найти похожий поток или поможет сделать, чтобы получить результаты.

 col_1_0_|ppi_event_id|col_2_0_                  |col_10_0_              |
--------|------------|--------------------------|-----------------------|
  149056|        3249|Draft                     |2020-08-25 13:01:49.016|
  149056|        3249|Submitted                 | 2020-08-25 13:10:22.01|
  149056|        3249|Submitted to administrator|2020-08-25 13:12:39.367|
  149056|        3249|Validated                 |2020-08-25 13:13:28.879|
  149060|        3249|Submitted to administrator|2020-08-25 13:32:41.924|
  

Ожидаемый результат

 col_1_0_|ppi_event_id|col_2_0_                  |col_10_0_              |
--------|------------|--------------------------|-----------------------|
  149056|        3249|Validated                 |2020-08-25 13:13:28.879|
  149060|        3249|Submitted to administrator|2020-08-25 13:32:41.924|
  

Кто-нибудь помогает в этом отношении.
Обновление: я попробовал решение, упомянутое ниже, но иногда оно показывает первую запись «Черновик», а не «Проверенный»
Есть ли другой вариант попробовать?

Ответ №1:

В Postgres я бы рекомендовал использовать distinct on : это хорошее расширение стандарта SQL, которое было создано именно для той цели, которую вы описываете.

 select distinct on (col_1_0) t.*
from mytable t
order by col_1_0, col_10_0_ desc
  

Комментарии:

1. Спасибо, это сработало. Возможно ли добавить столбец count вместе с этим, чтобы я мог видеть количество всех результатов в виде столбца в результатах?

Ответ №2:

Традиционный формат SQL заключается в использовании row_number()

ДЕМОНСТРАЦИЯ

 SELECT * FROM (
SELECT A.*, 
  ROW_NUMBER() OVER( PARTITION BY col_1_0_ ORDER BY col_10_0_) AS RN
FROM TABLE1 A ) X WHERE RN = 1;