如何编写SQL查询获取各PLC设备的最新数据行?
获取每台PLC设备的最新数据行SQL方案
你之前的TOP(1)写法只会返回全表的单条数据,无法按machineID分别提取每台设备的最新日志。以下是几种适配SQL Server的可行实现方案(假设表中存在时间戳字段如LogTime用于判断数据新旧,若实际字段名不同,替换为你表中的对应字段即可):
方案1:窗口函数ROW_NUMBER()(推荐)
这是最直观且高效的写法,通过分组排序筛选每组最新行:
WITH RankedData AS ( SELECT *, -- 按设备分组,每组内按时间戳倒序排名 ROW_NUMBER() OVER (PARTITION BY machineID ORDER BY LogTime DESC) AS RowNum FROM [moh01dtd].[dbo].[MasterPLC_Data] ) -- 取每组排名第一的行(即最新数据) SELECT * FROM RankedData WHERE RowNum = 1;
方案2:子查询关联最大时间戳
先获取每个设备的最新时间戳,再关联原表提取完整数据:
SELECT d.* FROM [moh01dtd].[dbo].[MasterPLC_Data] d INNER JOIN ( -- 找出每个设备的最新时间戳 SELECT machineID, MAX(LogTime) AS MaxLogTime FROM [moh01dtd].[dbo].[MasterPLC_Data] GROUP BY machineID ) t ON d.machineID = t.machineID AND d.LogTime = t.MaxLogTime;
注意:若同一设备在同一时间戳下有多条数据,此方案会返回所有符合条件的行;如需仅返回单条,可结合主键字段补充排序逻辑。
方案3:CROSS APPLY模拟单设备查询循环
此写法与你原本想对每个设备单独执行TOP(1)的逻辑完全匹配:
SELECT latest.* FROM ( -- 先获取所有唯一设备ID SELECT DISTINCT machineID FROM [moh01dtd].[dbo].[MasterPLC_Data] ) d CROSS APPLY ( -- 对每个设备取最新一行 SELECT TOP(1) * FROM [moh01dtd].[dbo].[MasterPLC_Data] WHERE machineID = d.machineID ORDER BY LogTime DESC ) latest;
内容的提问来源于stack exchange,提问作者Jan Baroš
相关产品推荐
相关产品推荐

