Calcular tiempo de inactividad en una consulta de análisis de transmisión
Hemos ingresado datos como:
Donde el plc_id es el ID de un PLC en particular y el zero-speed – 0 significa que la máquina está funcionando, 1 significa que la máquina está detenida.
Queremos calcular el tiempo de inactividad y almacenarlo en SQL. Aquí está la consulta de Stream Analytics que hemos escrito:
WITH SelectPreviousEvent AS
(
SELECT
*,
LAG([time]) OVER (LIMIT DURATION(hour, 24)) as previous<em>time,
LAG([zero-speed]) OVER (LIMIT DURATION(hour, 24)) as previous</em>speed,
LAG([plc<em>id]) OVER (LIMIT DURATION(hour,24)) as previous</em>plc,
[plc<em>id]
FROM [iot-input] TIMESTAMP BY [time]
)
-- selecciona el tiempo cuando la velocidad actual es igual a 1 y la velocidad anterior es igual a 0
SELECT
LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous</em>speed = 0 ) [started<em>time],
previous</em>time [end<em>time],
[plc</em>id],
[created<em>by] = 'Stream Analytics',
[updated</em>by] = 'Stream Analytics',
[duration] = DATEDIFF(second, LAG(time) OVER (LIMIT DURATION(hour, 24) WHEN previous<em>speed = 0 ), previous</em>time)
INTO [sql-output]
FROM SelectPreviousEvent
WHERE
[zero-speed] = 0
AND previous_speed = 1
Funciona como se espera cuando solo hay datos de un plc_id.
Resultado –
Hemos verificado este tiempo de inactividad con el cliente y confirmaron que es correcto.
Sin embargo, si queremos calcular el tiempo de inactividad para varios PLCs, como si hubiera otro PLC llamado plc5 y también estuviera enviando datos como plc4, obtenemos resultados inesperados.
He escrito algunas otras consultas pero ninguna de ellas funcionó. No pude obtener mucha ayuda de la documentación en este escenario.
Gracias de antemano.
davy.ai
Para calcular el tiempo de inactividad para varios PLCs, necesitamos agregar la columna [plc_id] a la cláusula GROUP BY en la consulta. Aquí está la consulta actualizada:
En la consulta actualizada, hemos agregado la columna [plc_id] a la cláusula PARTITION BY en la CTE SelectPreviousEvent. Luego, en la consulta principal, hemos agregado la columna [plc_id] a la cláusula GROUP BY. Esto asegurará que calculemos el tiempo de inactividad para cada [plc_id] por separado.
¡Espero que esto ayude! Hazme saber si tienes alguna otra pregunta.