MSSQL:按car_id分组获取max(exActId)对应的driver_id和contract_id
在MSSQL中获取每个car_id对应最大exActId的driver_id和contract_id
嘿,这个需求在MSSQL里有几种很实用的实现方式,我给你拆解下:
方法1:使用窗口函数(推荐,直观且灵活)
这是现在最常用的写法,用ROW_NUMBER()窗口函数给每个car_id分组内的记录按exActId降序编号,然后取编号为1的记录——也就是每个car_id对应最大exActId的那条:
WITH RankedRecords AS ( SELECT car_id, exActId, driver_id, contract_id, -- 按car_id分组,exActId降序排序,给每条记录编行号 ROW_NUMBER() OVER (PARTITION BY car_id ORDER BY exActId DESC) AS rn FROM YourTableName ) SELECT car_id, exActId, driver_id, contract_id FROM RankedRecords WHERE rn = 1;
如果你的场景中,同一个car_id可能存在多条exActId相同的最大值记录,想要把这些记录都返回的话,可以把ROW_NUMBER()换成RANK(),这样相同最大exActId的记录会得到相同的排名,都会被筛选出来。
方法2:子查询关联
先通过子查询找出每个car_id的最大exActId,再用这个结果和原表关联,拿到对应的driver_id和contract_id:
SELECT t.car_id, t.exActId, t.driver_id, t.contract_id FROM YourTableName t INNER JOIN ( -- 先获取每个car_id的最大exActId SELECT car_id, MAX(exActId) AS MaxExActId FROM YourTableName GROUP BY car_id ) m ON t.car_id = m.car_id AND t.exActId = m.MaxExActId;
这种方法的特点是:如果同一个car_id有多个记录共享最大exActId,所有匹配的记录都会被返回,和用RANK()的效果一致。
方法3:使用TOP 1 WITH TIES(适合快速返回结果)
如果你希望直接一次性查询出结果,可以用TOP 1 WITH TIES配合RANK()函数:
SELECT TOP 1 WITH TIES car_id, exActId, driver_id, contract_id FROM YourTableName ORDER BY RANK() OVER (PARTITION BY car_id ORDER BY exActId DESC);
这个写法会自动返回每个car_id组内排名第一的所有记录(也就是最大exActId的记录),语法上更简洁。
注意事项
- 记得把
YourTableName替换成你实际的表名 - 如果
exActId在每个car_id下是唯一的,那么三种方法的结果一致;如果有重复的最大值,根据需求选择返回单条还是多条记录的写法
内容的提问来源于stack exchange,提问作者Giga Grigalashvili
相关产品推荐
相关产品推荐

