SQL查询所有SensorID对应最新更新行的问题求助
解决方案
要获取每个SensorID对应最新时间戳的全量行数据,可使用窗口函数ROW_NUMBER()实现,该方法适配你当前使用的SQL Server以及绝大多数主流SQL数据库。
正确实现代码如下:
WITH SensorDataRanked AS ( SELECT [SensorId], [TimeStamp], [Description], [Type], [V1], [V2], [V3], [Latitude], [Longitude], -- 按SensorID分组,组内按时间戳倒序排序,最新的记录行号为1 ROW_NUMBER() OVER (PARTITION BY [SensorId] ORDER BY [TimeStamp] DESC) AS rn FROM [IoTDB].[dbo].[IOT] ) SELECT [SensorId], [TimeStamp] AS MAX_Timestamp, [Description] AS MAX_Description, [Type] AS MAX_Type, [V1] AS MAX_V1, [V2] AS MAX_V2, [V3] AS MAX_V3, [Latitude] AS MAX_Lat, [Longitude] AS MAX_Long FROM SensorDataRanked WHERE rn = 1 -- 只取每个Sensor的最新一条记录 ORDER BY SensorId;
补充说明
- 如果单个Sensor存在多条完全相同
TimeStamp的最新记录,上述写法只会返回其中一条,你可以在ORDER BY后追加排序字段(比如自增主键ID)来明确取数规则,也可以将ROW_NUMBER替换为RANK来返回所有同时间戳的最新记录。 - 如果你确认
Description、Type字段确实不随更新变化,也可以保留原GROUP BY写法,通过关联子查询匹配最新时间对应的行数据,窗口函数写法逻辑更清晰不易出错。
内容的提问来源于stack exchange,提问作者MacDev
相关产品推荐
相关产品推荐

