所以我有一个看起来像这样的表:
+-------------+-----------+-----------+-------------+
| 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
答案 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)
上的索引。