sql - 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
其他方法吗?
解决方案
基于联接的方法没有这个问题,并且会保留与给定日期的最大收入相关的所有记录。
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;
推荐阅读
- javascript - 将 JavaScript 鼠标事件从一个元素传播到另一个元素?
- spring-boot - 在spring boot中上传网络连接速度慢的文件时出错
- swift - 手动解决 Swift 包依赖项
- swift - 在 NSScrollView 中更改 NSView 的框架最终会产生奇怪的值
- qt5 - 为什么 Qt5 在使用信号时会警告有关 miisng 信号?
- javascript - Qlik 如何导入依赖于其他以太的 JS 库
- android - 是否有任何 Android 通知 setContentTitle 和 setContextText 魔法值?
- java - 如何使用具有使用 java 流的属性的不同对象的列表来创建不同对象的列表
- reactjs - 我想对 usestate 或其他钩子做出反应。实施 60 秒倒计时。如何
- php - LARAVEL 调用未定义的方法 Illuminate\Database\Eloquent\Builder::splice()