es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Calcular tiempo de inactividad en una consulta de análisis de transmisión

Hemos ingresado datos como:
image

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
image

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.

Tags:  , , ,

Answer

  1. Avatar for 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:

    WITH SelectPreviousEvent AS
    (
    SELECT
        *,
        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]) OVER (PARTITION BY [plc_id] LIMIT DURATION(hour,24)) as previous_plc,
        [plc_id]
    FROM [iot-input] TIMESTAMP BY [time]
    )
    SELECT 
        LAG(time) OVER (PARTITION BY [plc_id] 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 (PARTITION BY [plc_id] LIMIT DURATION(hour, 24) WHEN previous_speed = 0 ), previous_time)
    INTO [sql-output]
    FROM SelectPreviousEvent
    WHERE
        [zero-speed] = 0
        AND previous_speed = 1
    GROUP BY 
        [plc_id],
        LAG(time) OVER (PARTITION BY [plc_id] LIMIT DURATION(hour, 24) WHEN previous_speed = 0 ),
        previous_time
    

    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.

Comments are closed.