【问题标题】: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

标签: sql postgresql greatest-n-per-group


【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-25
      • 1970-01-01
      • 2019-04-02
      • 2014-05-29
      相关资源
      最近更新 更多