【问题标题】:Postgresql Get max value of each group with multiple columns [duplicate]Postgresql获取具有多列的每个组的最大值[重复]
【发布时间】:2019-08-14 20:17:35
【问题描述】:

我有下表

CREATE table test
(
    random_number INT,
    band VARCHAR(255),
    member_name VARCHAR(255)
);

INSERT INTO test VALUES(2300,'Metallica', 'Kirk');
INSERT INTO test VALUES(2000,'Metallica', 'Lars');
INSERT INTO test VALUES(2500,'Metallica', 'James');
INSERT INTO test VALUES(2800,'Metallica', 'Roberto');
INSERT INTO test VALUES(100,'SkidRow', 'Sebastian');
INSERT INTO test VALUES(140,'SkidRow', 'Rachel');
INSERT INTO test VALUES(110,'SkidRow', 'Scott');
INSERT INTO test VALUES(150,'SkidRow', 'Dave');
INSERT INTO test VALUES(100,'SkidRow', 'Rob');
INSERT INTO test VALUES(500,'Motorhead', 'Lemmy');
INSERT INTO test VALUES(100,'Motorhead', 'Mikkey');
INSERT INTO test VALUES(200,'Motorhead', 'Phil');

我怎样才能获得每个乐队中最大的random_number 并返回如下内容:

random_number |   band    | member_name
-----------------------------------------
     2800     | Metallica |  Roberto
     150      | SkidRow   |  Dave
     500      | Motorhead |  Lemmy

【问题讨论】:

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


【解决方案1】:

使用distinct on:

select distinct on (band) t.*
from test t
order by band, random_number desc;

Here 是一个 dbfiddle。

distinct on 是一个非常方便的 Postgres 扩展。对于大型数据集的性能,您需要(band, random_number desc) 上的索引。

【讨论】:

    【解决方案2】:

    通过分组和加入表找到最大的random_number

    select t.* 
    from test t inner join (
      select band, max(random_number) maxnum from test group by band
    ) g
    on g.band = t.band and g.maxnum = t.random_number
    

    demo

    【讨论】:

      【解决方案3】:

      使用MAX()

      SELECT max(random_number), band FROM test GROUP BY band
      

      见:https://rextester.com/BEZD44968

      结果是:

      no  max band
      1   2800 Metallica
      2   500 Motorhead
      3   150 SkidRow
      

      【讨论】:

      • 感谢您的回答。我想在结果中看到member_name
      • 啊,那就用distinct吧。请参阅@Gordon 的回答。
      猜你喜欢
      • 2021-02-01
      • 2018-03-30
      • 1970-01-01
      • 2018-11-21
      • 2017-09-12
      • 1970-01-01
      • 2020-11-01
      • 1970-01-01
      • 2011-11-27
      相关资源
      最近更新 更多