Tutorial: Utilizar funções de agregação
As funções de agregação permitem-lhe agrupar e combinar dados de várias linhas num valor de resumo. O valor de resumo depende da função escolhida, por exemplo, uma contagem, um valor máximo ou um valor médio.
Neste tutorial, irá aprender a:
Os exemplos neste tutorial utilizam a StormEvents
tabela, que está publicamente disponível no cluster de ajuda. Para explorar com os seus próprios dados, crie o seu próprio cluster gratuito.
Este tutorial baseia-se na base do primeiro tutorial, operadores comuns do Learn.
Pré-requisitos
- Uma conta Microsoft ou Microsoft Entra identidade de utilizador para iniciar sessão no cluster de ajuda
Utilizar o operador summarize
O operador summarize é essencial para efetuar agregações sobre os seus dados. O summarize
operador agrupa linhas com base na by
cláusula e, em seguida, utiliza a função de agregação fornecida para combinar cada grupo numa única linha.
Localize o número de eventos por estado com summarize
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 os resultados da consulta
Visualizar os resultados da consulta num gráfico ou gráfico pode ajudá-lo a identificar padrões, tendências e valores atípicos nos seus dados. Pode fazê-lo com o operador de composição .
Ao longo do tutorial, verá exemplos de como utilizar render
para apresentar os seus resultados. Por agora, vamos utilizar render
para ver os resultados da consulta anterior num gráfico de barras.
StormEvents
| summarize TotalStorms = count() by State
| render barchart
Contagem condicional de linhas
Ao analisar os seus dados, utilize countif() para contar linhas com base numa condição específica para compreender quantas linhas cumprem os critérios especificados.
A consulta seguinte utiliza countif()
a contagem de tempestades que causaram danos. Em seguida, a consulta utiliza o top
operador para filtrar os resultados e apresentar os estados com a maior quantidade de danos nas culturas causados por tempestades.
StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage
Saída
Estado | StormsWithCropDamage |
---|---|
IOWA | 359 |
NEBRASKA | 201 |
MISSISSIPPI | 105 |
CAROLINA DO NORTE | 82 |
MISSOURI | 78 |
Agrupar dados em classes
Para agregar por valores numéricos ou de tempo, primeiro vai querer agrupar os dados em classes com a função bin( ). A utilização bin()
pode ajudá-lo a compreender como os valores são distribuídos dentro de um determinado intervalo e a fazer comparações entre diferentes períodos.
A consulta seguinte conta o número de tempestades que causaram danos nas culturas para cada semana em 2007. O 7d
argumento representa uma semana, uma vez que 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 |
---|---|
01-2007-01T00:00:00Z | 16 |
01-2007-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.
Nota
bin()
é semelhante à floor()
função noutras linguagens de programação. Reduz todos os valores para o múltiplo mais próximo do módulo que fornece e permite summarize
atribuir as linhas a grupos.
Calcular o mínimo, o máximo, o valor médio e a soma
Para saber mais sobre os tipos de tempestades que causam danos nas culturas, calcule os danos nas culturas min(), max()e avg() para cada tipo de evento e, em seguida, ordene o resultado pelos danos médios.
Tenha em atenção que pode utilizar várias funções de agregação num único summarize
operador para produzir várias colunas calculadas.
StormEvents
| where DamageCrops > 0
| summarize
MaxCropDamage=max(DamageCrops),
MinCropDamage=min(DamageCrops),
AvgCropDamage=avg(DamageCrops)
by EventType
| sort by AvgCropDamage
Saída
EventType | MaxCropDamage | MinCropDamage | AvgCropDamage |
---|---|---|---|
Geada/Fixar | 568600000 | 3.000 | 9106087.5954198465 |
Incêndio florestal | 21000000 | 10000 | 7268333.333333333 |
Seca | 700000000 | 2000 | 6763977.8761061952 |
Inundação | 500000000 | 1000 | 4844925.23364486 |
Vento trovoada | 22000000 | 100 | 920328.36538461538 |
... | ... | ... | ... |
Os resultados da consulta anterior indicam que os eventos Frost/Freeze resultaram na maioria dos danos nas culturas, em média. No entanto, a consulta bin() mostrou que os eventos com danos nas culturas ocorreram principalmente nos meses de verão.
Utilize soma() para verificar o número total de culturas danificadas em vez da quantidade de eventos que causaram alguns danos, conforme feito na count()
consulta anterior bin().
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
Agora pode ver um pico de danos nas colheitas em janeiro, o que provavelmente se deveu a Frost/Freeze.
Dica
Utilize minif(), maxif(), avgif()e sumif() para realizar agregações condicionais, como fizemos quando na secção contagem condicional de linhas .
Calcular percentagens
Calcular percentagens pode ajudá-lo a compreender a distribuição e a proporção de valores diferentes nos seus dados. Esta secção abrange dois métodos comuns para calcular percentagens com o Linguagem de Pesquisa Kusto (KQL).
Calcular a percentagem com base em duas colunas
Utilize count() e countif para localizar a percentagem de eventos de tempestade que causaram danos nas culturas 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 colheitas em cada estado.
Em seguida, utilize expandir para calcular a percentagem entre as duas colunas ao dividir o número de tempestades com danos nas culturas pelo número total de tempestades e multiplicar por 100.
Para garantir que obtém um resultado decimal, utilize a função todoúvel() para converter pelo menos um dos valores de contagem de números inteiros num duplo antes de efetuar 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 | StormsWithCropDamage | PercentWithCropDamage |
---|---|---|---|
IOWA | 2337 | 359 | 15.36 |
NEBRASKA | 1766 | 201 | 11.38 |
MISSISSIPPI | 1218 | 105 | 8.62 |
CAROLINA DO NORTE | 1721 | 82 | 4.76 |
MISSOURI | 2016 | 78 | 3.87 |
... | ... | ... | ... |
Nota
Ao calcular percentagens, converta pelo menos um dos valores inteiros na divisão com todouble() ou toreal(). Isto irá garantir que não obtém resultados truncados devido à divisão de números inteiros. Para obter mais informações, veja 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 na base de dados, primeiro guarde o número total de tempestades na base de dados como uma variável. As instruções Let são utilizadas para definir variáveis numa consulta.
Uma vez que as instruções de expressão tabular devolvem resultados tabulares, utilize a função toscalar() para converter o resultado tabular da count()
função num valor escalar. Em seguida, o valor numérico pode ser utilizado no cálculo de percentagem.
let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0
Saída
EventType | EventCount | Percentagem |
---|---|---|
Vento 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 exclusivos
Utilize make_set() para transformar uma seleção de linhas numa tabela numa matriz de valores exclusivos.
A consulta seguinte utiliza make_set()
para criar uma matriz dos tipos de eventos que causam mortes em cada estado. Em seguida, a tabela resultante é ordenada pelo número de tipos de storm 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 | StormTypesWithDeaths |
---|---|
CALIFÓRNIA | ["Vento trovoada","Ondas Altas","Frio/Vento Frio","Vento Forte","Corrente de Rotura","Calor Excessivo","Fogo","Tempestade de Areia","Maré Baixa Astronómica","Nevoeiro Denso","Tempo de Inverno"] |
TEXAS | ["Inundação flash","Vento trovoada","Tornado","Relâmpago","Inundação","Tempestade de Gelo","Tempo de Inverno","Rip Current","Calor Excessivo","Nevoeiro Denso","Furacão (Tufão)","Frio/Vento Frio"] |
OKLAHOMA | ["Inundação Flash","Tornado","Frio/Vento Frio","Tempestade de Inverno","Neve Pesada","Calor Excessivo","Calor","Tempestade de Gelo","Tempo de Inverno","Nevoeiro Denso"] |
NEW YORK | ["Inundação","Relâmpago","Vento Trovoada","Inundação Repentina","Tempo de Inverno","Tempestade de Gelo","Frio Extremo/Vento Frio","Tempestade de Inverno","Neve Forte"] |
KANSAS | ["Vento trovoada","Chuva Forte","Tornado","Inundação","Inundação","Relâmpago","Neve Forte","Tempo de Inverno","Tempestade de Neve"] |
... | ... |
Registo de dados por condição
A função case() agrupa os dados em registos com base nas condições especificadas. A função devolve a expressão de resultado correspondente para o primeiro predicado satisfeito ou a expressão de outra forma final se nenhum dos predicados estiver satisfeito.
Este exemplo agrupa estados com base no número de lesões relacionadas com tempestades que os seus cidadãos sofreram.
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 | InjuriesCount | InjuriesBucket |
---|---|---|
ALABAMA | 494 | Grande |
ALASCA | 0 | Sem ferimentos |
SAMOA AMERICANA | 0 | Sem ferimentos |
ARIZONA | 6 | Pequeno |
ARKANSAS | 54 | Grande |
NORTE DO ATLÂNTICO | 15 | Médio |
... | ... | ... |
Crie um gráfico circular para visualizar a proporção de estados que sofreram tempestades, resultando num grande, médio ou pequeno número de lesões.
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
Executar agregações numa janela deslizante
O exemplo seguinte mostra como resumir colunas com uma janela deslizante.
A consulta calcula os danos mínimos, máximos e médios de propriedades de tornados, inundações e incêndios florestais usando uma janela deslizante de sete dias. Cada registo no conjunto de resultados agrega os sete dias anteriores e os resultados contêm um registo por dia no período de análise.
Eis uma explicação passo a passo da consulta:
- Desarme cada registo para um único dia em relação a
windowStart
. - Adicione sete dias ao valor do contentor para definir o fim do intervalo para cada registo. Se o valor estiver fora do intervalo de
windowStart
ewindowEnd
, ajuste o valor em conformidade. - Crie uma matriz de sete dias para cada registo, a partir do dia atual do registo.
- Expanda a matriz do passo 3 com mv-expand para duplicar cada registo para sete registos com intervalos de um dia entre eles.
- Efetue as agregações para cada dia. Devido ao passo 4, este passo resume os sete dias anteriores.
- Exclua os primeiros sete dias do resultado final porque não há um período de pesquisa 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 seguinte tabela de resultados está truncada. Para ver a saída completa, execute a consulta.
CarimboDeDataEHora | EventType | min_DamageProperty | max_DamageProperty | avg_DamageProperty |
---|---|---|---|---|
07-07-08T00:00:00Z | Tornado | 0 | 30000 | 6905 |
07-07-08T00:00:00Z | Inundação | 0 | 200000 | 9261 |
07-07-08T00:00:00Z | Incêndio florestal | 0 | 200000 | 14033 |
07-07-09T00:00:00Z | Tornado | 0 | 100000 | 14783 |
07-07-09T00:00:00Z | Inundação | 0 | 200000 | 12529 |
07-07-09T00:00:00Z | Incêndio florestal | 0 | 200000 | 14033 |
07-2007-10T00:00:00Z | Tornado | 0 | 100000 | 31400 |
07-2007-10T00:00:00Z | Inundação | 0 | 200000 | 12263 |
07-2007-10T00:00:00Z | Incêndio florestal | 0 | 200000 | 11694 |
... | ... | ... |
Passo seguinte
Agora que já conhece os operadores de consulta comuns e as funções de agregação, avance para o próximo tutorial para saber como associar dados de várias tabelas.
Comentários
https://aka.ms/ContentUserFeedback.
Brevemente: Ao longo de 2024, vamos descontinuar progressivamente o GitHub Issues como mecanismo de feedback para conteúdos e substituí-lo por um novo sistema de feedback. Para obter mais informações, veja:Submeter e ver comentários