计算流分析查询中的停机时间
Calculate downtime in stream analytics query
我们输入了这样的数据 -
在哪里
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,我们得到了意想不到的结果。
我写了一些其他的查询,但 none 中的查询有效。我无法从有关此场景的文档中获得太多帮助。
提前致谢。
您需要在 LAG
中 PARTITION BY plc_id
,以便仅针对 plc_id 进行计算。有关详细信息,请参阅 that doc。
这里给出:
...
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。但是您应该再次需要它来进行以下计算。
我们输入了这样的数据 -
在哪里 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,我们得到了意想不到的结果。
我写了一些其他的查询,但 none 中的查询有效。我无法从有关此场景的文档中获得太多帮助。
提前致谢。
您需要在 LAG
中 PARTITION BY plc_id
,以便仅针对 plc_id 进行计算。有关详细信息,请参阅 that doc。
这里给出:
...
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。但是您应该再次需要它来进行以下计算。