You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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š

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 00:45:37