如何在具有最新行的postgres中按分钟汇总日期

How to aggregate date by minutes in postgres having latest row

我正在尝试按分钟聚合数据,同时在某一分钟内有多个记录,但我只对最后一条记录感兴趣。例如:

 id |        date         |          data                  
----+---------------------+----------------------
 1  | 2021-12-22 16:14:03 | {"x": 1, "y": 2}
 2  | 2021-12-22 16:14:13 | {"x": 5, "y": 4}
 3  | 2021-12-22 16:14:23 | {"x": 6, "y": 5}
 4  | 2021-12-22 16:15:33 | {"x": 7, "y": 6}
 5  | 2021-12-22 16:15:48 | {"x": 8, "y": 10}

我想要实现的是:

 id |        date      |          data                  
----+------------------+---------------------
 3  | 2021-12-22 16:14 | {"x": 6, "y": 5}
 5  | 2021-12-22 16:15 | {"x": 8, "y": 10}

我只想要某分钟的最后记录。我尝试按“格式化”日期分组,但我不知道如何只获取最新行:

SELECT to_char(date, 'YYYY-MM-DD HH24:MI') as date_formatted ... FROM table GROUP BY 1

您可以使用 window 函数来实现:

select id, 
       to_char("date", 'yyyy-mm-dd hh24:mi') as date, 
       data
from (
   select id, "date", data, 
          dense_rank() over (partition by date_trunc('minute', "date") order by "date" desc) as rnk
   from the_table
) t
where rnk = 1
order by id;

date_trunc() 将具有相同分钟的所有行放入同一分区(组),然后使用 order by "date" desc 从中选择最新的行。

Online example