PostgreSQL最近的日期基于2个ID

时间:2018-10-03 14:48:26

标签: sql postgresql greatest-n-per-group

所以我有一个看起来像这样的表:

+-------------+-----------+-----------+-------------+
| 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  |
+-------------+-----------+-----------+-------------+

我的目标是从每个购买ID和明细ID的最近日期获取状态ID,因此在这种情况下:

+-------------+-----------+-----------+-------------+
| 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  |
+-------------+-----------+-----------+-------------+

我尝试获取MAX日期,但是我需要的是状态ID,这迫使我按状态ID分组,这不符合目的。我尝试过的其他事情也为我提供了相同购买ID的重复详细ID。

我正在使用PostgreSQL 9.3.10

1 个答案:

答案 0 :(得分:0)

如何使用窗口功能?

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)上的索引。