Compartir a través de


LAG (Análisis de transmisiones de Azure)

El operador analítico LAG permite que uno busque un evento "anterior" en un flujo de eventos, dentro de determinadas restricciones. Resulta muy útil calcular la tasa de crecimiento de una variable, detectar cuándo una variable cruza un umbral o cuando una condición comienza o deja de ser verdadera.

En Stream Analytics, el ámbito de LAG (es decir, lo lejos del historial del evento actual que necesita buscar) siempre se limita a un intervalo de tiempo finito, mediante la cláusula LIMIT DURATION. Opcionalmente, LAG puede limitarse a considerar solo los eventos que coinciden con el evento actual en una determinada propiedad o condición mediante las cláusulas PARTITION BY y WHEN.

LAG no se ve afectado por predicados en la cláusula WHERE, condiciones de combinación en la cláusula JOIN o expresiones de agrupación en la cláusula GROUP BY de la consulta actual porque se evalúa antes de esas cláusulas.

Syntax

LAG(<scalar_expression >, [<offset >], [<default>])  
     OVER ([PARTITION BY <partition key>] LIMIT DURATION(<unit>, <length>) [WHEN boolean_expression])
  

Por ejemplo:

LAG(reading) OVER (LIMIT DURATION(hour, 3))  
LAG(name, 2, 'none such') OVER (PARTITION BY userId LIMIT DURATION(minute, 2))  

Argumentos

scalar_expression

El valor que se va a devolver en función del desplazamiento especificado. Es una expresión de cualquier tipo que devuelve un único valor (escalar) o la expresión de carácter comodín ' *'. Para '*' se devolverá todo el evento según el desplazamiento especificado y se incluirá en el evento de resultado (registro anidado).
scalar_expression no puede contener otras funciones de análisis ni funciones externas.

offset

El número de eventos desde el evento actual desde el que se va a obtener un valor. Si no se especifica, el valor predeterminado es 1, lo que significa que devuelve el evento anterior. El desplazamiento debe ser un entero mayor o igual que 1. Los eventos se procesan en orden temporal. Si hay varios eventos con la misma marca de tiempo, estos se procesan en el orden de llegada.

default

Valor que se devuelve cuando no hay ningún evento en el desplazamiento especificado. Si no se especifica ningún valor predeterminado, se devuelve NULL. 'Ningún evento en el desplazamiento especificado' puede ser el caso 1) si el número de eventos correspondientes vistos hasta ahora es menor que el desplazamiento especificado o 2) si el evento en el desplazamiento especificado se agota el tiempo de espera según los eventos de limit_duration_clause 3) especificados, pero no coincide con la condición booleana especificada en el when_clause.

Si el evento en el desplazamiento especificado existe y el valor de scalar_expression es NULL, NULL
. default puede ser una columna, una subconsulta u otra expresión, pero no puede contener otras
funciones analíticas o funciones externas. default debe tener exactamente el mismo tipo que
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause La cláusula partition BY <partition key> solicita que solo los eventos cuyo valor de
<la clave> de partición es la misma que la del evento actual que se debe tener en cuenta. Por ejemplo,

LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  

devolverá la lectura anterior del mismo sensor que el evento actual (si se produjo en la hora anterior).

cláusula limit_duration DURATION(<unit>, <length>)

Especifica la cantidad de historial del evento actual que se debe tener en cuenta. Para ver una descripción detallada de las unidades que se admiten y sus abreviaturas, consulte DATEDIFF. Si no se encuentran suficientes eventos coincidentes dentro del intervalo DURATION, se devuelve el <valor predeterminado> .

when_clause
Especifica una condición booleana para los eventos que se deben tener en cuenta en el cálculo de LAG. Si no se encuentran suficientes eventos coincidentes dentro del intervalo DURATION, se devuelve el <valor predeterminado> . El when_clause es opcional.

Tipos de valor devuelto

El tipo de datos del valor de scalar_expression especificado. Se devuelve NULL si scalar_expression

Notas generales

LAG es no determinista. Los eventos se procesan en orden temporal. Si hay varios eventos con la misma marca de tiempo, estos se procesan en el orden de llegada.

La aplicación de LAG en el conjunto de resultados de una función de ventana puede producir resultados inesperados. Las funciones de ventana modifican la marca de tiempo de los eventos, ya que cada operación de ventana genera un evento al final de la ventana. Se puede tener acceso a la marca de tiempo actual de un evento con system.timestamp(), después de una operación de ventana que difiere del atributo de hora del evento original. Si ELG no se puede mover antes de la operación de ventana, considere la posibilidad de usar CollectTop, ordenando por la hora del evento original.

Ejemplos

Calcule la tasa de crecimiento, por sensor:

SELECT sensorId,  
       growth = reading -
                        LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))  
FROM input  
  

Busque la lectura anterior del sensor no null:

SELECT  
     sensorId,  
     LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN reading IS NOT NULL)  
     FROM input  
  

Busque la lectura anterior de sensor que no sea NULL para un tipo de sensor específico:

WITH filterSensor AS
(
  SELECT *
  FROM input
  WHERE input.sensorType = 4 AND sensorId IS NOT NULL
)

SELECT
  LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1))
FROM filterSensor

Determine cuándo una variable cruza un umbral:

SELECT
    sensorId, reading
FROM input
WHERE
    devicetype = 'thermostat'
    AND reading > 100
    AND LAG(reading) OVER (PARTITION BY sensorId LIMIT DURATION(hour, 1) WHEN devicetype = 'thermostat') <= 100

Consulte también

ISFIRST (Azure Stream Analytics)
LAST (Azure Stream Analytics)