在postgres中多次分组后选择一行

时间:2016-06-27 10:28:59

标签: sql postgresql group-by time-series windowing

我在postgres DB中有一个表,它具有以下结构:

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

现在我想实现以下目标:

  1. 在groupme1和groupme2
  2. 之后对表格进行分组
  3. 获取每个组的价值
  4. 但是只有每个组合的最后一个条目(日期后的日期)
  5. 示例:

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

    有更快更好的方法吗?窗口功能可以帮助解决这个问题吗?

1 个答案:

答案 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;