SQL需求:按KeyCon分组获取CallsCount最大值对应的Address字段
解决方案
原数据表
| Key | KeyCon | Adress | CallsCount |
|---|---|---|---|
| 1 | 100 | Build9 | 15 |
| 2 | 100 | Build0 | 10 |
| 3 | 101 | Build7 | 24 |
| 4 | 101 | Build4 | 17 |
| 5 | 102 | Build3 | 10 |
期望输出
| KeyCon | Adress |
|---|---|
| 100 | Build9 |
| 101 | Build7 |
| 102 | Build3 |
方法1:使用窗口函数(推荐,适用于MySQL 8+、PostgreSQL、SQL Server等支持窗口函数的数据库)
用ROW_NUMBER()对每个KeyCon分组内的记录按CallsCount降序排序,取排序后行号为1的记录,就是每组CallsCount最大的那条:
SELECT KeyCon, Adress FROM ( SELECT KeyCon, Adress, ROW_NUMBER() OVER (PARTITION BY KeyCon ORDER BY CallsCount DESC) AS rn FROM your_table_name ) t WHERE rn = 1;
如果同一KeyCon下有多个记录的CallsCount值相同且都是最大值,ROW_NUMBER()会随机返回一条;若要返回所有最大值记录,可替换为RANK()。
方法2:子查询关联
先分组查询得到每个KeyCon对应的最大CallsCount,再关联原表匹配对应Adress:
SELECT t1.KeyCon, t1.Adress FROM your_table_name t1 JOIN ( SELECT KeyCon, MAX(CallsCount) AS max_count FROM your_table_name GROUP BY KeyCon ) t2 ON t1.KeyCon = t2.KeyCon AND t1.CallsCount = t2.max_count;
注意:若同一KeyCon下有多个记录的CallsCount等于最大值,该查询会返回所有符合条件的行。
方法3:使用NOT EXISTS(兼容性好,适用于老版本数据库)
通过NOT EXISTS筛选出:不存在同KeyCon下CallsCount更大的记录,这类记录即为每组的最大值记录:
SELECT KeyCon, Adress FROM your_table_name t1 WHERE NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.KeyCon = t1.KeyCon AND t2.CallsCount > t1.CallsCount );
与方法2一致,若同一组存在多个最大值记录,会返回所有符合条件的行。
内容的提问来源于stack exchange,提问作者Unknown User
相关产品推荐
相关产品推荐

