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)