如何编写SQL语句选取每种Type对应最小Id的行?
没问题,这是几种能实现你需求的SQL写法,你可以根据自己使用的数据库类型来选择合适的方案:
首先明确下你的表数据和需求:
表X的原始数据:
Id Type Name 1 1 Jane 2 2 Mary 3 3 Rose 4 4 Rachel 5 4 Darren 6 4 Jay
需要得到每种Type中Id最小的行,结果如下:
| Id | Type | Name |
|---|---|---|
| 1 | 1 | Jane |
| 2 | 2 | Mary |
| 3 | 3 | Rose |
| 4 | 4 | Rachel |
方法1:使用窗口函数(推荐,适用于主流数据库如MySQL 8+、PostgreSQL、SQL Server等)
窗口函数ROW_NUMBER()可以给每个Type分组内的行按Id排序,筛选出排序第一的行即可:
SELECT Id, Type, Name FROM ( SELECT Id, Type, Name, ROW_NUMBER() OVER (PARTITION BY Type ORDER BY Id ASC) AS rn FROM X ) t WHERE rn = 1;
这里PARTITION BY Type按Type分组,ORDER BY Id ASC让每个组里Id最小的行排在最前,最后取rn=1的行就是目标结果。
方法2:GROUP BY + 子查询(兼容老版本数据库)
先通过GROUP BY获取每个Type对应的最小Id,再关联原表拿到完整的行数据:
SELECT x.Id, x.Type, x.Name FROM X x JOIN ( SELECT Type, MIN(Id) AS MinId FROM X GROUP BY Type ) t ON x.Type = t.Type AND x.Id = t.MinId;
子查询先算出每个Type的最小Id,再用JOIN匹配原表中对应Id的行,同样能得到你要的结果。
方法3:关联子查询(逻辑直观的写法)
直接判断当前行的Id是否是对应Type的最小Id,是则保留:
SELECT Id, Type, Name FROM X x WHERE Id = ( SELECT MIN(Id) FROM X WHERE Type = x.Type );
这几种方法都能满足你的需求,选适合你数据库环境的就行~
内容的提问来源于stack exchange,提问作者yeungcase
相关产品推荐
相关产品推荐

