PostgreSQL Самая последняя дата на основе 2 идентификаторов - PullRequest
0 голосов
/ 03 октября 2018

Итак, у меня есть таблица, которая выглядит примерно так:

+-------------+-----------+-----------+-------------+
| Purchase ID | Detail ID | Status ID | Status Date |
+-------------+-----------+-----------+-------------+
|       20532 |         1 |         1 | 2018-04-18  |
|       20532 |         1 |         3 | 2018-05-18  |
|       20145 |         1 |         1 | 2018-04-18  |
|       20145 |         2 |         4 | 2018-06-18  |
|       20145 |         2 |         4 | 2018-07-18  |
+-------------+-----------+-----------+-------------+

Моя цель - получить идентификатор статуса по самой последней дате для каждого идентификатора покупки и идентификатора детали, поэтому в данном случае:

+-------------+-----------+-----------+-------------+
| Purchase ID | Detail ID | Status ID | Status Date |
+-------------+-----------+-----------+-------------+
|       20532 |         1 |         3 | 2018-05-18  |
|       20145 |         1 |         1 | 2018-04-18  |
|       20145 |         2 |         4 | 2018-07-18  |
+-------------+-----------+-----------+-------------+

Я пытался получить МАКСИМАЛЬНУЮ дату, но мне нужен идентификатор статуса, и он заставляет меня группировать по идентификатору статуса, что побеждает цель.Другие вещи, которые я пробовал, дали мне дубликаты подробных идентификаторов для того же идентификатора покупки.

Я использую PostgreSQL 9.3.10

1 Ответ

0 голосов
/ 03 октября 2018

Как насчет использования оконных функций?

select t.*
from (select t.*,
             row_number() over (partition by detailid order by statusdate desc) as seqnum_d,
             row_number() over (partition by statusid order by statusdate desc) as seqnum_s
      from t
     ) t
where seqnum_d = 1 or seqnum_s = 1;

РЕДАКТИРОВАТЬ:

Если вы хотите самую последнюю дату для комбинации , вы можете использовать partition by detailid, statusid.Другой метод:

select distinct on (detailid, statusid) t.*
from t
order by detailid, statusid, statusdate desc;

distinct on часто быстрее, чем другие методы.И он может воспользоваться индексом на (detailid, statusid, statusdate).

...