LAG (Azure Stream Analytics)

O operador analítico LAG permite-lhe procurar um evento "anterior" num fluxo de eventos, dentro de determinadas restrições. É muito útil para calcular a taxa de crescimento de uma variável, detetar quando uma variável ultrapassa um limiar ou quando uma condição começa ou deixa de ser verdadeira.

No Stream Analytics, o âmbito de LAG (ou seja, a distância anterior à história do evento atual que precisa de procurar) está sempre limitado a um intervalo de tempo finito, utilizando a cláusula LIMIT DURATION. Opcionalmente, o LAG pode ser limitado a considerar apenas eventos que correspondam ao evento atual numa determinada propriedade ou condição através das cláusulas PARTITION BY e WHEN.

O LAG não é afetado por predicados na cláusula WHERE, condições de associação na cláusula JOIN ou expressões de agrupamento na cláusula GROUP BY da consulta atual porque é avaliada antes dessas cláusulas.

Syntax

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

Por exemplo:

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

Argumentos

scalar_expression

O valor a ser devolvido com base no desvio especificado. É uma expressão de qualquer tipo que devolve um único valor (escalar) ou a expressão de caráter universal '*'. Para "*" todo o evento de acordo com o desvio especificado será devolvido e será contido no evento de resultado (registo aninhado).
scalar_expression não pode conter outras funções analíticas ou funções externas.

desvio

O número de eventos de volta do evento atual a partir do qual obter um valor. Se não for especificado, a predefinição é 1, o que significa que devolve o evento anterior. O desvio tem de ser um número inteiro maior ou igual a 1. Os eventos são processados por ordem temporal. Se existirem vários eventos com o mesmo carimbo de data/hora, os eventos são processados pela ordem de chegada.

predefinição

O valor a devolver quando não existe nenhum evento no desvio especificado. Se não for especificado um valor predefinido, é devolvido NULL. "Nenhum evento no desvio especificado" pode ser o caso 1) se o número de eventos correspondentes vistos até agora for menor do que o desvio especificado ou 2) se o evento no desvio especificado exceder o limite de tempo de acordo com os eventos especificados limit_duration_clause 3), mas não corresponder à condição booleana especificada no when_clause.

Se o evento no desvio especificado existir e o valor de scalar_expression for NULO, nulo
do produto". predefinição pode ser uma coluna, subconsulta ou outra expressão, mas não pode conter outra
funções analíticas ou funções externas. predefinição tem de ter exatamente o mesmo tipo que
scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause PARTITION BY <partition key> clause requests that only events whose value of
<A chave> de partição é igual à do evento atual. Por exemplo,

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

devolverá a leitura anterior do mesmo sensor que o evento atual (se tal tiver ocorrido na 1 hora anterior).

cláusula limit_duration DURAÇÃO(<unidade>; <comprimento>)

Especifica a quantidade de histórico do evento atual que tem de ser considerada. Veja DATEDIFF para obter uma descrição detalhada das unidades suportadas e das respetivas abreviaturas. Se não forem encontrados eventos correspondentes suficientes dentro do intervalo DURAÇÃO, é devolvido o <valor predefinido> .

when_clause
Especifica a condição booleana para que os eventos sejam considerados na computação LAG. Se não forem encontrados eventos correspondentes suficientes dentro do intervalo DURAÇÃO, é devolvido o <valor predefinido> . O when_clause é opcional.

Tipos de Retorno

O tipo de dados do scalar_expression especificado. NULL é devolvido se scalar_expression

Observações Gerais

LAG não é determinístico. Os eventos são processados por ordem temporal. Se existirem vários eventos com o mesmo carimbo de data/hora, os eventos são processados pela ordem de chegada.

A aplicação de LAG no conjunto de resultados de uma função de janela pode produzir resultados inesperados. As funções de janela alteram o carimbo de data/hora dos eventos, uma vez que cada operação de janela produz o evento no final da janela. O carimbo de data/hora atual de um evento pode ser acedido com system.timestamp(), após uma operação de janela, será diferente do atributo de hora do evento original. Se o LAG não puder ser movido antes da operação da janela, considere utilizar CollectTop, ordenando pela hora original do evento.

Exemplos

Calcule a taxa de crescimento, por sensor:

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

Localize a leitura anterior do sensor não nulo:

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

Localize a leitura anterior de sensores não nulos para um 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

Determinar quando uma variável ultrapassa um limiar:

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 também

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