1
我正试图计算数据库中总的丢失机器时间。表中的列是MachineID aka PlantID,StartTime,EndTime。减去查询中前一行值的SQL最佳方法?
理论上它只是简单地按machineID和StartTime对表进行排序,然后取当前行的StartTime并减去前面的行EndTime。
这是我的作品目前查询:
SELECT SUM([StartTime] - [EndTime]) AS TotalLostTime
FROM(SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [PlantID], [StartTime]) AS [Row],
[MachineRecords].PlantID , [MachineRecords].EndTime
FROM [MachineRecords]) AS a
JOIN (SELECT *
FROM (SELECT ROW_NUMBER() OVER (ORDER BY [PlantID],
[StartTime]) AS [Row1],
[MachineRecords].PlantID as PlantID1 ,
[MachineRecords].StartTime
FROM [MachineRecords]) as b) m
ON m.PlantID1 = a.[PlantID]
AND a.[Row] = m.[Row1]-1) lostTimeQuery
我的问题是:有没有更好的(更consise)实现此查询的结果相同的方式吗?
感谢您的帮助。
编辑:
从wildplasser的评论后,我已经创建了该查询:
SELECT SUM(a.StartTime - a.LagEnd) as LostTime
FROM (SELECT [PlantID], [StartTime], [EndTime],
LAG([PlantID]) OVER (ORDER BY PlantID, StartTime) LagPlantID,
LAG([EndTime]) OVER (ORDER BY PlantID, StartTime) LagEnd
FROM MachineRecords) a
WHERE a.PlantID = a.LagPlantID
窗口功能,这样就生成的查询作为滞后()? – wildplasser
这似乎是什么即时通讯:) – Anthbs
您使用的是什么RDBMS?并不是所有人都支持这个特定的功能。另外,我们可以得到一个示例模式?例如,如果您有一个(存储的)序列号_per plantId_,则不需要即时计算它。 –