按多列分组,但只返回一行。仅聚合一列
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;
【讨论】:
以上是关于按多列分组,但只返回一行。仅聚合一列的主要内容,如果未能解决你的问题,请参考以下文章