如何在具有最新行的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
从中选择最新的行。
我正在尝试按分钟聚合数据,同时在某一分钟内有多个记录,但我只对最后一条记录感兴趣。例如:
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
从中选择最新的行。