首页 > 解决方案 > GROUP BY 查询后选择多个最大值

问题描述

假设我有一个如下所示的表:

   date ID  income
0   9/1 C   10.40
1   9/3 A   33.90
2   9/3 B   29.10
3   9/4 C   19.30
4   9/4 B   17.80
5   9/5 B   9.55
6   9/5 C   11.10
7   9/5 A   13.10
8   9/7 A   29.10
9   9/7 B   29.10

我想找出每个日期收入最多的 ID。最直观的方法是写作

SELECT ID, MAX(income) FROM table GROUP BY date

但是有两个 ID 在 上获得了相同的MAX收入9/7,我想保留同一日期的所有联系,通过使用该查询,我将忽略 上的一个 ID 9/7,并29.1出现在9/3和上,还有9/7其他方法吗?

标签: sqlsqlitegroup-by

解决方案


基于联接的方法没有这个问题,并且会保留与给定日期的最大收入相关的所有记录。

SELECT t1.*
FROM yourTable t1
INNER JOIN
(
    SELECT date, MAX(income) AS max_income
    FROM yourTable
    GROUP BY date
) t2
    ON t1.date = t2.date AND t1.income = t2.max_income
ORDER BY
    t1.date;

上述查询的工作方式是将完整的原始表连接到一个子查询,该子查询为每个日期查找最大收入值。这具有过滤掉在给定日期没有最大收入的任何记录的效果。密切注意加入条件,它有两个组成部分,日期和收入。

如果你的数据库支持解析功能,我们RANK这里也可以使用:

SELECT date, ID, income
FROM
(
    SELECT t.*, RANK() OVER (PARTITION BY date ORDER BY income DESC) rnk
    FROM yourTable t
) t
WHERE rnk = 1
ORDER BY date;

推荐阅读