我們輸入的資料如下 -

其中 plc_id是特定 PLC零速的 ID - 0 表示機器正在運行,1 表示機器已停止。
我們要計算停機時間并將其存盤到sql中。這是我們撰寫的流分析查詢 -
WITH SelectPreviousEvent AS
(
SELECT
*,
LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous_time,
LAG([zero-speed]) OVER (LIMIT DURATION(hour, 24)) as previous_speed,
LAG([plc_id]) OVER (LIMIT DURATION(hour,24)) as previous_plc,
[plc_id]
FROM [iot-input] TIMESTAMP BY [time]
)
-- selects time when current_speed is equal to 1 and previous_speed is equal to 0
SELECT
LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_speed = 0 ) [started_time],
previous_time [end_time],
[plc_id],
[created_by] = 'Stream Analytics',
[updated_by] = 'Stream Analytics',
[duration] = DATEDIFF(second, LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous_speed = 0 ), previous_time)
INTO [sql-output]
FROM SelectPreviousEvent
WHERE
[zero-speed] = 0
AND previous_speed = 1
當只有一個 plc_id 的資料時,它按預期作業。
輸出-

我們已經與客戶核實了這個停機時間,他們說這是正確的。
但是,如果我們想計算多個 PLC 的停機時間,例如如果還有一個名為plc5 的PLC并且它也像plc4一樣發送資料,我們會得到意想不到的結果。
我寫了一些其他的查詢,但沒有一個作業。我無法從有關此場景的檔案中獲得太多幫助。
提前致謝。
uj5u.com熱心網友回復:
您需要輸入PARTITION BY plc_id,LAG以便僅為該plc_id完成計算。有關更多資訊,請參閱該檔案。
這里給出:
...
LAG([time]) OVER (PARTITION BY plc_id LIMIT DURATION(hour, 24)) as previous_time,
LAG([zero-speed]) OVER (PARTITION BY plc_id LIMIT DURATION(hour, 24)) as previous_speed,
...
您不應該將它用于LAG(plc_id),否則您將獲得相同的 plc_id。但是您應該再次需要它來進行以下計算。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/400084.html
標籤:天蓝色 溪流 azure-stream-分析 数据流
