LAG (Azure Stream Analytics)

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

No Stream Analytics, o escopo de LAG (ou seja, o quão distante do histórico do evento atual ele precisa parecer) é sempre limitado a um intervalo de tempo finito, usando a cláusula LIMIT DURATION. Opcionalmente, LAG pode ser limitado a considerar apenas eventos que correspondam ao evento atual em uma determinada propriedade ou condição usando as cláusulas PARTITION BY e WHEN.

LAG não é afetado por predicados na cláusula WHERE, condições de junção na cláusula JOIN ou expressões de agrupamento na cláusula GROUP BY da consulta atual porque ela é 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 retornado com base no deslocamento especificado. É uma expressão de qualquer tipo que retorna um valor único (escalar) ou uma expressão curinga "*". Para '*' o evento inteiro de acordo com o deslocamento especificado será retornado e estará contido no evento de resultado (registro aninhado).
scalar_expression não pode conter outras funções analíticas ou externas.

offset

O número de eventos retornado do evento atual a partir do qual obter um valor. Se não for especificado, o padrão será 1, o que significa que ele retorna o evento anterior. O deslocamento deve ser um inteiro maior ou igual a 1. Eventos são processados em ordem temporal. Se houver vários eventos com os mesmos carimbo de data / hora, os eventos são processados em ordem de chegada.

default

O valor a ser retornado quando não houver nenhum evento no deslocamento especificado. Se um valor padrão não for especificado, NULL será retornado. 'Nenhum evento no deslocamento especificado' poderá ser o caso 1) se o número de eventos correspondentes vistos até agora for menor que o deslocamento especificado ou 2) se o evento no deslocamento especificado for cronometrado de acordo com os eventos especificados limit_duration_clause 3), mas não corresponder à condição booliana especificada no when_clause.

Se o evento no deslocamento especificado existir e o valor de scalar_expression for NULL, NULL
é retornado. default pode ser uma coluna, subconsulta ou outra expressão, mas não pode conter outra
funções analíticas ou funções externas. default deve ter exatamente o mesmo tipo que
Scalar_expression.

OVER ( [ partition_by_clause ] limit_duration_clause [when_clause])

partition_by_clause A cláusula de chave> de partição PARTITION BY <solicita que apenas eventos cujo valor de
<A chave> de partição é a mesma que a do evento atual a ser considerado. Por exemplo,

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

retornará a leitura anterior do mesmo sensor que o evento atual (se isso ocorreu dentro da 1 hora anterior).

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

Especifica quanto do histórico do evento atual deve ser considerado. Consulte DATEDIFF para obter uma descrição detalhada de unidades com suporte e suas abreviações. Se não forem encontrados eventos correspondentes suficientes dentro do intervalo DURATION, o <valor padrão> será retornado.

when_clause
Especifica a condição booliana para os eventos a serem considerados na computação LAG. Se não forem encontrados eventos correspondentes suficientes dentro do intervalo DURATION, o <valor padrão> será retornado. O when_clause é opcional.

Tipos de retorno

O tipo de dados da scalar_expression especificada. NULL será retornado se scalar_expression

Comentários gerais

LAG é não determinística. Eventos são processados em ordem temporal. Se houver vários eventos com os mesmos carimbo de data / hora, os eventos são processados em ordem de chegada.

Aplicar 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, pois cada operação de janela gera eventos no final da janela. O carimbo de data/hora atual de um evento pode ser acessado com system.timestamp(), após uma operação de janela, ele será diferente do atributo de hora do evento original. Se LAG não puder ser movido antes da operação de janela, considere usar CollectTop, ordenando pela hora do evento original.

Exemplos

Compute 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 do sensor não nulo 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

Determine quando uma variável ultrapassa um limite:

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)