计算流分析查询中的停机时间

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 中的查询有效。我无法从有关此场景的文档中获得太多帮助。

提前致谢。

您需要在 LAGPARTITION 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。但是您应该再次需要它来进行以下计算。