LAG (Azure Stream Analytics)

L’opérateur analytique LAG permet de rechercher un événement « précédent » dans un flux d’événements, dans certaines contraintes. Il est très utile pour calculer le taux de croissance d’une variable, détecter quand une variable dépasse un seuil ou quand une condition commence ou cesse d’être vraie.

Dans Stream Analytics, l’étendue du LAG (c’est-à-dire la distance dans l’historique de l’événement actuel qu’il doit examiner) est toujours limitée à un intervalle de temps fini, à l’aide de la clause LIMIT DURATION. Le lag peut éventuellement être limité à ne prendre en compte que les événements qui correspondent à l’événement actuel sur une certaine propriété ou condition à l’aide des clauses PARTITION BY et WHEN.

Lag n’est pas affecté par les prédicats dans la clause WHERE, les conditions de jointure dans la clause JOIN ou le regroupement d’expressions dans la clause GROUP BY de la requête actuelle, car elle est évaluée avant ces clauses.

Syntax

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

Exemple :

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

Arguments

scalar_expression

Valeur à retourner en fonction du décalage spécifié. Il s'agit soit d'une expression de tout type, qui renvoie une valeur (scalaire) unique, soit de l'expression générique « * ». Pour '*', l’événement entier en fonction du décalage spécifié sera retourné et sera contenu dans l’événement de résultat (enregistrement imbriqué).
scalar_expression ne peut pas contenir d’autres fonctions analytiques ou de fonctions externes.

offset

Nombre d'événements antérieurs à l'événement actuel à partir desquels obtenir une valeur. Si elle n’est pas spécifiée, la valeur par défaut est 1, ce qui signifie qu’elle retourne l’événement précédent. Offset doit être un entier supérieur ou égal à 1. Les événements sont traités dans l'ordre temporel. S'il existe plusieurs événements avec le même horodatage, ils sont traités dans l'ordre d'arrivée.

default

Valeur à renvoyer s'il n'existe aucun événement au décalage spécifié. Si aucune valeur par défaut n'est spécifiée, la valeur NULL est renvoyée. « Aucun événement au décalage spécifié » peut être le cas 1) si le nombre d’événements correspondants observés jusqu’à présent est inférieur au décalage spécifié ou 2) si l’événement au décalage spécifié est dépassé en fonction du limit_duration_clause 3) les événements spécifiés existent mais ne correspondent pas à la condition booléenne spécifiée dans le when_clause.

Si l’événement au décalage spécifié existe et que la valeur de scalar_expression est NULL, null
» est renvoyé. default peut être une colonne, une sous-requête ou une autre expression, mais elle ne peut pas contenir d’autres
fonctions analytiques ou fonctions externes. default doit avoir exactement le même type que
scalar_expression.

OVER ( [ clause_partition_by ] clause_limit_duration [clause_when])

partition_by_clause La clause de clé> de partition PARTITION BY <demande uniquement aux événements dont la valeur est
<la clé> de partition est la même que celle de l’événement actuel à considérer. Par exemple,

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

retourne la lecture précédente du même capteur que l’événement actuel (si cela s’est produit au cours de l’heure précédente).

limit_duration clause DURATION(<unit>, <length>)

Spécifie la quantité de l’historique de l’événement actuel à prendre en compte. Consultez DATEDIFF pour obtenir une description détaillée des unités prises en charge et de leurs abréviations. S’il n’y a pas suffisamment d’événements correspondants dans l’intervalle DURATION, la <valeur par défaut> est retournée.

clause_when
Spécifie la condition booléenne pour les événements à prendre en compte dans le calcul LAG. S’il n’y a pas suffisamment d’événements correspondants dans l’intervalle DURATION, la <valeur par défaut> est retournée. La when_clause est facultative.

Types de retour

Type de données de la valeur scalar_expression spécifiée. NULL est renvoyé si scalar_expression

Remarques d'ordre général

LAG n'est pas déterministe. Les événements sont traités dans l'ordre temporel. S'il existe plusieurs événements avec le même horodatage, ils sont traités dans l'ordre d'arrivée.

L’application de LAG sur le jeu de résultats d’une fonction de fenêtrage peut produire des résultats inattendus. Les fonctions de fenêtrage modifient l’horodatage des événements, car chaque opération de fenêtre génère un événement à la fin de la fenêtre. L’horodatage actuel d’un événement est accessible avec system.timestamp() ; après une opération de fenêtre, il sera différent de l’attribut d’heure d’événement d’origine. Si LE LAG ne peut pas être déplacé avant l’opération de fenêtre, envisagez d’utiliser CollectTop, en fonction de l’heure de l’événement d’origine.

Exemples

Calculez le taux de croissance, par capteur :

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

Recherchez la lecture précédente du capteur non null :

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

Recherchez la lecture précédente du capteur non null pour un type de capteur spécifique :

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

Déterminez quand une variable dépasse un seuil :

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

Voir aussi

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