Tutorial: Usar funções de agregação

Alterne entre serviços usando a lista suspensa Version. Saiba mais sobre navegação.
Aplica a: ✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure Monitor ✅ Microsoft Sentinel

As funções de agregação agrupam e combinam dados de várias linhas num valor resumo. O valor resumido depende da função escolhida, como um valor de contagem, máximo ou médio.

Neste tutorial, aprenderás como:

Os exemplos neste tutorial usam a StormEvents tabela, que está disponível publicamente no cluster de ajuda. Para explorar com seus próprios dados, crie seu próprio cluster gratuito.

Os exemplos neste tutorial usam a StormEvents tabela, que está disponível publicamente nos dados de exemplo de análise meteorológica.

Este tutorial baseia-se na base do primeiro tutorial, Aprenda operadores comuns.

Pré-requisitos

Para executar as consultas a seguir, você precisa de um ambiente de consulta com acesso aos dados de exemplo. Use uma das seguintes opções:

  • Uma conta da Microsoft ou identidade de usuário do Microsoft Entra para entrar no cluster de ajuda

Use o operador resumir

O operador de resumo é essencial para realizar agregações sobre os seus dados. O summarize operador agrupa as linhas com base na by cláusula e depois usa a função de agregação fornecida para combinar cada grupo numa única linha.

Encontre o número de eventos por estado usando summarize, com a função de agregação contagem.

StormEvents
| summarize TotalStorms = count() by State

Saída

Estado TotalStorms
TEXAS 4701
KANSAS 3166
IOWA 2337
ILLINOIS 2022
MISSOURI 2016
... ...

Visualizar resultados da consulta

A visualização dos resultados da consulta em um gráfico pode ajudá-lo a identificar padrões, tendências e valores atípicos em seus dados. Pode criar estas visualizações usando o operador de renderização .

Ao longo do tutorial, vês exemplos de como render usar para mostrar os teus resultados. Alguns tipos de gráficos disponíveis incluem gráficos de barras, gráficos de linhas, gráficos circulares e gráficos de dispersão. Para já, use render para ver os resultados da consulta anterior num gráfico de barras.

StormEvents
| summarize TotalStorms = count() by State
| render barchart

Captura de tela do total de tempestades por gráfico de barras de estado criado com o operador de renderização.

Contar linhas condicionalmente

Ao analisar os seus dados, use countif() para contar linhas com base numa condição específica. Esta função ajuda-o a perceber quantas linhas cumprem os critérios dados.

A consulta seguinte utiliza countif() para contar tempestades que causaram danos. Em seguida, a consulta usa o operador top para filtrar os resultados e exibir os estados com a maior quantidade de danos às colheitas causados por tempestades.

StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage

Saída

Estado TempestadesComDanosNaColheita
IOWA 359
NEBRASCA 201
MISSISSIPPI 105
CAROLINA DO NORTE 82
MISSOURI 78

Agrupar dados em compartimentos

Para agregar dados por valores numéricos ou temporais, primeiro agrupe os dados em compartimentos usando a função bin(). Usar bin() ajuda a perceber como os valores são distribuídos dentro de um determinado intervalo e facilita a comparação de diferentes períodos.

A consulta seguinte conta o número de tempestades que causaram danos nas colheitas para cada semana em 2007. O 7d argumento representa uma semana, pois a função requer um valor de período de tempo válido.

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)

Saída

StartTime EventCount
2007-01-01T00:00:00Z 16
2007-01-08T00:00:00Z 20
2007-01-29T00:00:00Z 8
2007-02-05T00:00:00Z 1
2007-02-12T00:00:00Z 3
... ...

Adicione | render timechart ao final da consulta para visualizar os resultados.

Captura de tela do gráfico de danos de corte por semana renderizado pela consulta anterior.

Observação

bin() é semelhante à floor() função em outras linguagens de programação. Ele reduz cada valor para o múltiplo mais próximo do módulo que você fornece e permite summarize atribuir as linhas a grupos.

Calcular o mín, máx, méd e soma

Para saber mais sobre os tipos de tempestades que causam danos nas colheitas, calcule os danos min(), max() e avg() nas colheitas para cada tipo de evento. Depois, ordena o resultado pelo dano médio.

Pode usar múltiplas funções de agregação num único summarize operador para produzir várias colunas computadas.

StormEvents
| where DamageCrops > 0
| summarize
    MaxCropDamage=max(DamageCrops), 
    MinCropDamage=min(DamageCrops), 
    AvgCropDamage=avg(DamageCrops)
    by EventType
| sort by AvgCropDamage

Saída

Tipo de Evento MaxCropDamage MinCropDamage AvgCropDamage
Geada/Congelação 568600000 3000 9106087.5954198465
Incêndio florestal 21000000 10000 7268333.333333333
Seca 700000000 2000 6763977.8761061952
Inundação 500000000 1000 4844925.23364486
Vento de Tempestade com Trovoada 22000000 100 920328.36538461538
... ... ... ...

Os resultados da consulta anterior indicam que os eventos de geada/congelação resultam, em média, nos maiores danos nas culturas. No entanto, a consulta bin() mostra que os eventos com danos nas culturas ocorrem maioritariamente nos meses de verão.

Use sum() para verificar o número total de colheitas danificadas em vez da quantidade de eventos que causaram alguns danos, como feito na count()consulta bin() anterior.

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize CropDamage = sum(DamageCrops) by bin(StartTime, 7d)
| render timechart

Captura de tela do gráfico de tempo mostrando os danos da colheita por semana.

Agora você pode ver um pico nos danos às safras em janeiro, que provavelmente foi devido à geada / congelamento.

Sugestão

Use minif(), maxif(), avgif() e sumif() para realizar agregações condicionais, como fez na secção de contagem condicional de linhas .

Calcular percentagens

O cálculo de porcentagens pode ajudá-lo a entender a distribuição e a proporção de diferentes valores em seus dados. Esta secção aborda dois métodos comuns para calcular percentagens utilizando a Linguagem de Consulta Kusto (KQL).

Calcular a percentagem com base em duas colunas

Use count() e countif para encontrar a porcentagem de eventos de tempestade que causaram danos às colheitas em cada estado. Primeiro, conte o número total de tempestades em cada estado. Em seguida, conte o número de tempestades que causaram danos nas lavouras em cada estado.

Em seguida, use estender para calcular a porcentagem entre as duas colunas, dividindo o número de tempestades com danos na safra pelo número total de tempestades e multiplicando por 100.

Para garantir que você obtenha um resultado decimal, use a função todouble() para converter pelo menos um dos valores de contagem de inteiros em um duplo antes de executar a divisão.

StormEvents
| summarize 
    TotalStormsInState = count(),
    StormsWithCropDamage = countif(DamageCrops > 0)
    by State
| extend PercentWithCropDamage = 
    round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage

Saída

Estado TotalStormsInState TempestadesComDanosNaColheita PercentagemComDanosNasCulturas
IOWA 2337 359 15.36
NEBRASCA 1766 201 11.38
MISSISSIPPI 1218 105 8.62
CAROLINA DO NORTE 1721 82 4.76
MISSOURI 2016 78 3.87
... ... ... ...

Observação

Ao calcular porcentagens, converta pelo menos um dos valores inteiros na divisão com todouble() ou toreal(). Esta conversão garante que não obtém resultados truncados devido à divisão de inteiros. Para obter mais informações, consulte Regras de tipo para operações aritméticas.

Calcular a percentagem com base no tamanho da tabela

Para comparar o número de tempestades por tipo de evento com o número total de tempestades no banco de dados, primeiro salve o número total de tempestades no banco de dados como uma variável. Utilize instruções Let para definir variáveis numa consulta.

Como as instruções de expressão tabular retornam resultados tabulares, use a função toscalar() para converter o resultado tabular da count() função em um valor escalar. Depois, use o valor numérico no cálculo percentual.

let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0

Saída

Tipo de Evento EventCount Percentagem
Vento de Tempestade com Trovoada 13015 22.034673077574237
Granizo 12711 21.519994582331627
Inundação repentina 3688 6.2438627975485055
Seca 3616 6,1219652592015716
Tempo de inverno 3349 5.669928554498358
... ... ...

Extrair valores únicos

Use make_set() para transformar uma seleção de linhas em uma tabela em uma matriz de valores exclusivos.

A consulta a seguir usa make_set() para criar uma matriz dos tipos de eventos que causam mortes em cada estado. A tabela resultante é então classificada pelo número de tipos de tempestade em cada matriz.

StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)

Saída

Estado Tipos de tempestade com mortes
CALIFÓRNIA ["Vento de Trovoada","Surf Alto","Frio/Vento Frio","Vento Forte","Corrente de Rip","Calor","Calor Excessivo","Incêndio","Tempestade de Poeira","Maré Baixa Astronómica","Neblina Densa","Tempo de inverno"]
TEXAS ["Inundação Repentina","Vento de Trovoada","Tornado","Relâmpago","Dilúvio","Tempestade de Gelo","Tempo de inverno","Corrente de Rip","Calor Excessivo","Neblina Densa","Furacão (Tufão)","Frio/Vento Frio"]
OKLAHOMA ["Inundação Relâmpago","Tornado","Frio/Vento Frio","Tempestade de inverno","Neve Pesada","Calor Excessivo","Calor","Tempestade de Gelo","Tempo de inverno","Neblina Densa"]
NOVA IORQUE ["Dilúvio","Relâmpago","Vento de Trovoada","Inundação Repentina","Tempo de inverno","Tempestade de Gelo","Frio Extremo/Vento Frio","Tempestade de inverno","Neve Pesada"]
KANSAS ["Vento de Trovoada","Chuva Forte","Tornado","Dilúvio","Inundação Relâmpago","Neve Pesada","Tempo de inverno","Nevasca"]
... ...

Dados do bucket por condição

A função case() agrupa dados em buckets com base em condições especificadas. A função retorna a expressão de resultado correspondente ao primeiro predicado satisfeito, ou a expressão else final se nenhum predicado for satisfeito.

Este exemplo agrupa os Estados com base no número de ferimentos relacionados com tempestades sofridos pelos seus cidadãos.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| sort by State asc

Saída

Estado Contagem de Lesões Repositório de Lesões
ALABAMA 494 Grande
ALASKA 0 Sem feridos
SAMOA AMERICANA 0 Sem feridos
ARIZONA 6 Pequeno
ARKANSAS 54 Grande
ATLÂNTICO NORTE 15 Médio
... ... ...

Crie um gráfico de setor para visualizar a proporção de estados que experienciaram tempestades resultando em um grande, médio ou pequeno número de feridos.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| summarize InjuryBucketByState=count() by InjuriesBucket
| render piechart 

Captura de ecrã do gráfico circular da interface web renderizado pela consulta anterior.

Executar agregações em uma janela deslizante

O exemplo seguinte mostra como resumir colunas usando uma janela deslizante.

A consulta calcula o mínimo, máximo e médio dos danos materiais de tornados, inundações e incêndios florestais utilizando uma janela deslizante de sete dias. Cada registro no conjunto de resultados agrega os sete dias anteriores, e os resultados contêm um registro por dia no período de análise.

Aqui está uma explicação passo a passo da consulta:

  1. Agrupe cada registro num único dia em relação a windowStart.
  2. Adicione sete dias ao valor do bin para definir o fim do intervalo para cada registo. Se o valor estiver fora do intervalo de windowStart e windowEnd, ajuste o valor de acordo.
  3. Crie uma matriz de sete dias para cada registro, a partir do dia atual do registro.
  4. Expanda o array a partir do passo 3 usando o mv-expand para duplicar cada registo para sete registos com intervalos de um dia entre eles.
  5. Realize as agregações para cada dia. Devido ao passo 4, este passo resume os sete dias anteriores.
  6. Exclua os primeiros sete dias do resultado final porque não há um período de retrospetiva de sete dias para eles.
let windowStart = datetime(2007-07-01);
let windowEnd = windowStart + 13d;
StormEvents
| where EventType in ("Tornado", "Flood", "Wildfire") 
| extend bin = bin_at(startofday(StartTime), 1d, windowStart) // 1
| extend endRange = iff(bin + 7d > windowEnd, windowEnd, 
                      iff(bin + 7d - 1d < windowStart, windowStart, 
                        iff(bin + 7d - 1d < bin, bin, bin + 7d - 1d))) // 2
| extend range = range(bin, endRange, 1d) // 3
| mv-expand range to typeof(datetime) // 4
| summarize min(DamageProperty), max(DamageProperty), round(avg(DamageProperty)) by Timestamp=bin_at(range, 1d, windowStart), EventType // 5
| where Timestamp >= windowStart + 7d; // 6

Saída

A tabela de resultados a seguir está truncada. Para ver a saída completa, execute a consulta.

Data e Hora Tipo de Evento min_DamageProperty Propriedade_DanoMáximo avg_DamageProperty
2007-07-08T00:00:00Z Tornado 0 30000 6905
2007-07-08T00:00:00Z Inundação 0 200000 9261
2007-07-08T00:00:00Z Incêndio florestal 0 200000 14033
2007-07-09T00:00:00Z Tornado 0 100000 14783
2007-07-09T00:00:00Z Inundação 0 200000 12529
2007-07-09T00:00:00Z Incêndio florestal 0 200000 14033
2007-07-10T00:00:00Z Tornado 0 100000 31400
2007-07-10T00:00:00Z Inundação 0 200000 12263
2007-07-10T00:00:00Z Incêndio florestal 0 200000 11694
... ... ...

Próximo passo

Agora que você está familiarizado com operadores de consulta comuns e funções de agregação, vá para o próximo tutorial para aprender a unir dados de várias tabelas.