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)