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_,則不需要即時計算它。 –