SQL实现按AU_Id分组获取最小diff对应的Score
问题描述
现有如下数据表:
| ID | date | diff | score |
|---|---|---|---|
| A | 03/08/2023 | 9 | 783 |
| B | 11/08/2023 | 34 | 356 |
| B | 11/08/2023 | 67 | 726 |
| B | 11/08/2023 | 105 | 12 |
| B | 11/08/2023 | 120 | 837 |
| C | 31/09/2023 | 568 | 7 |
| C | 31/09/2023 | 580 | 72 |
需要编写SQL语句,获取每个ID对应的最小diff值所对应的Score。例如,ID为B时,因diff最小值为34,应返回Score值356。
方法一:子查询关联
先通过子查询计算每个ID的最小diff值,再关联原表筛选对应数据:
SELECT t.ID, t.score FROM your_table t INNER JOIN ( SELECT ID, MIN(diff) AS min_diff FROM your_table GROUP BY ID ) sub ON t.ID = sub.ID AND t.diff = sub.min_diff;
逻辑说明:
- 子查询按ID分组,得到每个ID的最小diff值;
- 原表与子查询通过ID和diff值关联,精准匹配到每个ID最小diff对应的score。
方法二:窗口函数(适用于MySQL 8+、PostgreSQL、SQL Server等)
利用ROW_NUMBER()窗口函数对每组数据排序,取diff最小的行:
SELECT ID, score FROM ( SELECT ID, score, ROW_NUMBER() OVER (PARTITION BY ID ORDER BY diff ASC) AS rn FROM your_table ) t WHERE rn = 1;
逻辑说明:
- 内层查询中,
PARTITION BY ID按ID分组,ORDER BY diff ASC让组内数据按diff从小到大排序,ROW_NUMBER()为每组行分配序号; - 外层筛选序号为1的行,即每组diff最小的记录对应的score。
注意:若同一ID下存在多条diff同为最小值的记录,
ROW_NUMBER()会随机返回其中一条;如需保留所有符合条件的记录,可替换为RANK()或DENSE_RANK()函数。
内容的提问来源于stack exchange,提问作者silbia
相关产品推荐
相关产品推荐

