基于组 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】:

您应该可以通过partitionrow_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的主要内容,如果未能解决你的问题,请参考以下文章

用R中的组中的非NA字符替换一组值的NA [重复]

按组每 5 行子集?

对 Spark DataFrame 中第一列的值形成的组中的其他列进行排序

您不能为现有 IPv4 CIDR 规则指定引用的组 ID。在 AWS 安全组中编辑入站规则时提示

如何从 JSPlumb 中的组中删除项目?

如果组中的最后一个元素包含Pandas中的特定字符串,则标记