基于组 ID 子集的时间戳列的组中的最后一行 - Postgres
Posted
技术标签:
【中文标题】基于组 ID 子集的时间戳列的组中的最后一行 - Postgres【英文标题】:Last Row In Group Based on Timestamp Column For a Subset of Group Ids - Postgres 【发布时间】:2020-07-28 20:52:33 【问题描述】:给定一个如下形式的 postgres 表:
group id | timestamp | value
---------+-------------------------------+------
1 | 2020-04-15 15:04:44.020288+00 | 8.0
2 | 2020-04-15 15:05:44.020288+00 | 9.0
3 | 2020-04-15 15:06:44.020288+00 | 10.0
4 | 2020-04-15 15:07:44.020288+00 | 11.0
1 | 2020-04-15 15:08:44.020288+00 | 12.0
2 | 2020-04-15 15:09:44.020288+00 | 13.0
3 | 2020-04-15 15:10:44.020288+00 | 14.0
4 | 2020-04-15 15:11:44.020288+00 | 15.0
基于时间戳列检索组 ID 子集的最后一行的 SQL 查询是什么?
例如,检索组 ID 1,3
的最后一行以生成:
group id | timestamp | value
---------+-------------------------------+------
1 | 2020-04-15 15:08:44.020288+00 | 12.0
3 | 2020-04-15 15:10:44.020288+00 | 14.0
提前感谢您的考虑和回复
【问题讨论】:
【参考方案1】:您应该可以通过partition
和row_number()
做到这一点:
with cte1 as (
select
*,
row_number() over (partition by group_id order by timestamp desc) as row_number
from yourtable t
)
select *
from cte1
where row_number = 1
【讨论】:
【参考方案2】:在 Postgres 中解决这个 best-n-per-group 问题的一种简单有效的方法是使用distinct on
:
select distinct on (group_id) t.*
from mytable t
where group_id in (1, 3)
order by group_id, timestamp desc
【讨论】:
以上是关于基于组 ID 子集的时间戳列的组中的最后一行 - Postgres的主要内容,如果未能解决你的问题,请参考以下文章
对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序