按多列分组,但只返回一行。仅聚合一列

Posted

技术标签:

【中文标题】按多列分组,但只返回一行。仅聚合一列【英文标题】:Group by multiple columns, but returning only one line. Agreggating on only one column 【发布时间】:2021-09-21 22:14:39 【问题描述】:

如果我有这张桌子

Contract : Code : Date
62          11    01/01/2016
62          16    01/02/2016
62          09    01/03/2016

我只想返回这一行,

Contract : Code : Date
62          09    01/03/2016

我想做一个选择合约,最大(数据),代码按合约分组

但我不能,因为代码列应该以某种形式聚合。

我已经尝试了每个聚合函数,但在更大的数据集中它们都不起作用。比如,最大值,最小值,总和,计数等。 我只需要该合同和日期的代码。

你们能帮帮我吗?非常感谢

【问题讨论】:

我认为 ANSI 的答案是使用子查询,通过 contract 加入同一个表并选择 code 【参考方案1】:

Postgres 有一个非常方便的扩展名为 distinct on,它非常有效地做到了这一点:

select distinct on (contract) t.*
from t
order by contract, date desc;

distinct on 为括号中键的每个值返回一行。该行是遇到的第一行——基于order by——对于每组值。

【讨论】:

【参考方案2】:

有一个非常简单的通用模式使用聚合来做到这一点:

找到最大值,然后重新加入表格。

我假设表格是 R(Contract, Code, Date)。

注意我如何重命名 M 中的属性以匹配 R 中的属性名称。

WITH M as (
    select contract, max(date) as date 
    from R group by contract)
  select * from R natural join M;

窗口函数也可以这样做。

如果你只想要最大值,那么:

WITH M as (
    select max(date) as date 
    from R)
  select * from R natural join M;

【讨论】:

以上是关于按多列分组,但只返回一行。仅聚合一列的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 按一列分组并获得最低值

如何对按客户分组的多列和多行求和

按多列对数据框进行分组[重复]

如何按多列分组以在熊猫数据框中列出

如何在 MySQL Select 语句中按多列分组

使用influxdb时可以按多列进行grafana分组