在Postgres中的多个分组之后选择一行



我在Postgres DB中有一个表格,该表具有以下结构:

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
  • 需要长时间

是否有更快,更好的方法?窗口功能可以帮助您吗?

我认为您只想要窗口功能:

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;

最新更新