Postgresql获取具有多列的每个组的最大值[重复]

Posted

技术标签:

【中文标题】Postgresql获取具有多列的每个组的最大值[重复]【英文标题】:Postgresql Get max value of each group with multiple columns [duplicate] 【发布时间】: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

【问题讨论】:

查看窗口函数:***.com/questions/3800551/… 【参考方案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 的回答。

以上是关于Postgresql获取具有多列的每个组的最大值[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 PostgreSQL 中按类别选择具有最大日期组的 id?

获取 ActiveRecord 中每个组的最小值/最大值

获取每个月 SQL 的组的 MAX 值

如何编写 SQL 来选择具有每个组的最大值(值)的行?

postgresql:具有外键的多个多列索引?

解决 mySQL 中每个组的最大得分球员