Partilhar via


GAL

✅ Azure Stream Analytics ✅ Fabric Eventstream

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

No Stream Analytics, o escopo do GAL (ou seja, o quão distante no histórico do evento atual ele precisa olhar) é sempre limitado a um intervalo de tempo finito, usando a cláusula LIMIT DURATION. Opcionalmente, o GAL 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.

O GAL 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 é avaliado antes dessas cláusulas.

Sintaxe

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 único valor (escalar) ou a expressão curinga '*'. Para '*', todo o evento 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 funções externas.

Deslocamento

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

padrão

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» pode ser o caso 1) se o número de eventos correspondentes vistos até agora for menor do que o deslocamento especificado ou 2) se o evento no deslocamento especificado for expirado de acordo com o limit_duration_clause especificado 3) os eventos existirem mas não corresponderem à condição booleana especificada no when_clause.

Se o evento no deslocamento especificado existir e o valor de scalar_expression for NULL, então NULL
é devolvido. O padrão pode ser uma coluna, subconsulta ou outra expressão, mas não pode conter outras
funções analíticas ou funções externas. o padrão 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
<chave> de partição é a mesma do evento atual 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 tal tiver ocorrido na 1 hora anterior).

Cláusula limit_duration DURAÇÃO (<unidade>, <comprimento>)

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

when_clause
Especifica a condição booleana para os eventos a serem considerados no cálculo do GAL. Se não forem encontrados eventos correspondentes suficientes dentro do intervalo DURATION, o <valor padrão> será retornado. O when_clause é opcional.

Tipos de devolução

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

Observações gerais

O GAL não é determinístico. Os eventos são processados em ordem temporal. Se houver vários eventos com o mesmo carimbo de data/hora, os eventos são processados na ordem de chegada.

A aplicação do 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 um evento 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 o LAG não puder ser movido antes da operação da janela, considere usar o CollectTop, ordenando pela hora do evento original.

Exemplos

Calcule a taxa de crescimento, por sensor:

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

Encontre 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  
  

Encontre 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

Ver também

ISFIRST
ÚLTIMOS