我在postgres DB中有一个表,它具有以下结构:
id | date | groupme1 | groupme2 | value
----------------------------------------
1 |
2 |
3 |
现在我想实现以下目标:
示例:
id | date | groupme1 | groupme2 | value
---------------------------------------
| | A | 1 | 4
| | A | 2 | 7
| | A | 3 | 3
| | B | 1 | 9
我目前的做法如下:
SELECT a.*
FROM table AS a
JOIN (SELECT max(id) AS id
FROM table
GROUP BY groupme1, groupme2) AS b
ON a.id = b.id
这种方法的问题:
有更快更好的方法吗?窗口功能可以帮助解决这个问题吗?
答案 0 :(得分:0)
我认为你只想要窗口功能:
select t.*
from (select t.*,
row_number() over (partition by groupme1, groupme2 order by date desc) as seqnum
from t
) t
where seqnum = 1;
或者,在Postgres中执行此操作的更好方法是使用distinct on
:
select distinct on (groupme1, groupme2) t.*
from t
order by groupme1, groupme2, date desc;