无需手动键入所有列即可从 group by 中获取一条记录

Posted

技术标签:

【中文标题】无需手动键入所有列即可从 group by 中获取一条记录【英文标题】:Taking one record from group by without manually typing all columns 【发布时间】:2021-02-18 19:07:13 【问题描述】:

我有一个包含以下列的表格:

id, col_1, col_2, col_3, .... col_1000, timestamp

我希望每个 id 只有一条记录,并采用最新的时间戳。也就是说,我的查询是:

select id, max_by(col_1, timestamp), max_by(col_2, timestamp), max_by(col_3, timestamp), ... max_by(col_1000, timestamp), max_by(timestamp, timestamp) group by id

既然有这么多列,我想知道有没有办法可以做类似的事情:

select max_by(*, timestamp) group by id

这样我就不必手动输入所有列了吗?谢谢!

【问题讨论】:

【参考方案1】:

嗯。 . .你可以使用row_number():

select t.*
from (select t.*,
             row_number() over (partition by id order by timestamp desc) as seqnum
      from t
     ) t
where seqnum = 1;

您也可以使用相关子查询或join 来表达这一点:

select t.*
from t join
     (select id, max(timestamp) as max_timestamp
      from t
      group by id
     ) tt
     on t.id = tt.id and t.timestamp = tt.max_timestamp

【讨论】:

以上是关于无需手动键入所有列即可从 group by 中获取一条记录的主要内容,如果未能解决你的问题,请参考以下文章

从 group by 获取列描述

通过 group by 和 joins 获取多个表的多个列的总和

应用 group_by 并汇总数据,同时保留所有列的信息

在 SQL 中使用 Group By 和 Aggregate - 获取错误“选择列表中的列无效,因为它不包含在聚合函数或 GROUP BY 中”

从 GROUP BY 中获取具有 NULL 列的行

使用数据框在pyspark中获取列post group by