0

我在 postgres 数据库中有一个表,其结构如下:

id | date | groupme1 | groupme2 | value
---------------------------------------- 
1  |  
2  |  
3  |  

现在我想实现以下目标:

  1. 在 groupme1 和 groupme2 之后对表进行分组
  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

这种方法的问题:

  • 它假定较高的日期具有较高的 id
  • 需要很长时间

有没有更快更好的方法来做到这一点?窗口功能可以帮助解决这个问题吗?

4

1 回答 1

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;
于 2016-06-27T10:31:42.037 回答