获取DriverLocation表中各DriverID最新签到时间的SQL查询需求
解决DriverLocation表取每个司机最新签到时间的SQL方案
这是日常开发里很常见的分组取最值需求,我给你两种实用的写法,适配不同场景:
方法一:GROUP BY + MAX聚合函数(基础款)
如果只需要获取每个DriverID对应的最新签到时间,用这个写法最直接:
SELECT DriverID, MAX(DateTime) AS LatestSignInTime FROM DriverLocation GROUP BY DriverID;
原理很简单:按DriverID分组后,用MAX(DateTime)提取每组里最大的时间值(也就是最新的签到时间),刚好能得到你标注的那些需要保留的记录。
方法二:窗口函数ROW_NUMBER()(扩展款)
要是之后你的表需要新增字段(比如签到位置、设备ID等),想同时获取最新签到记录的其他信息,窗口函数的写法会更灵活:
WITH RankedDrivers AS ( SELECT DriverID, DateTime, -- 按DriverID分组,每组内按时间倒序排名 ROW_NUMBER() OVER (PARTITION BY DriverID ORDER BY DateTime DESC) AS rn FROM DriverLocation ) SELECT DriverID, DateTime AS LatestSignInTime FROM RankedDrivers WHERE rn = 1;
这里PARTITION BY DriverID负责按司机分组,ORDER BY DateTime DESC把每组的记录按时间从新到旧排序,ROW_NUMBER()会给每组的第一条(最新时间)标记为rn=1,最后筛选出rn=1的记录就行。
额外注意点
- 确保
DateTime字段的类型是datetime/timestamp这类时间类型,不然聚合和排序会出错; - 如果存在同一个司机同一时间多次签到的情况,方法一会返回一条记录(因为MAX值相同),方法二用
ROW_NUMBER()会随机选一条,要是想保留所有相同的最新记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。
内容的提问来源于stack exchange,提问作者weeraa
相关产品推荐
相关产品推荐

