Dela via


Självstudie: Använda sammansättningsfunktioner

Med sammansättningsfunktioner kan du gruppera och kombinera data från flera rader till ett sammanfattningsvärde. Sammanfattningsvärdet beror på den valda funktionen, till exempel ett antal, maximalt eller genomsnittligt värde.

I den här självstudien får du lära dig att:

Exemplen i den här självstudien StormEvents använder tabellen, som är offentligt tillgänglig i hjälpklustret. Om du vill utforska med dina egna data skapar du ett eget kostnadsfritt kluster.

Den här självstudien bygger på grunden från den första självstudiekursen, Learn common operators.

Förutsättningar

  • Ett Microsoft-konto eller en Microsoft Entra användaridentitet för att logga in på hjälpklustret

Använda sammanfattningsoperatorn

Sammanfattningsoperatorn är viktig för att utföra aggregeringar över dina data. Operatorn summarize grupperar rader baserat på by -satsen och använder sedan den angivna aggregeringsfunktionen för att kombinera varje grupp på en enda rad.

Hitta antalet händelser efter tillstånd med hjälp summarize av funktionen count aggregation.

StormEvents
| summarize TotalStorms = count() by State

Resultat

Tillstånd TotalStorms
TEXAS 4701
KANSAS 3166
IOWA 2337
ILLINOIS 2022
MISSOURI 2016
... ...

Visualisera frågeresultat

Genom att visualisera frågeresultat i ett diagram eller diagram kan du identifiera mönster, trender och extremvärden i dina data. Du kan göra detta med återgivningsoperatorn .

I självstudien visas exempel på hur du använder render för att visa dina resultat. För tillfället ska vi använda render för att se resultatet från föregående fråga i ett stapeldiagram.

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

Skärmbild av totalt antal stormar efter tillståndsstapeldiagram som skapats med återgivningsoperatorn.

Räkna rader villkorsstyrt

När du analyserar dina data använder du countif() för att räkna rader baserat på ett visst villkor för att förstå hur många rader som uppfyller de angivna kriterierna.

Följande fråga använder countif() för att räkna stormar som orsakat skador. Frågan använder sedan operatorn top för att filtrera resultatet och visa tillstånden med den högsta mängden beskärningsskador som orsakas av stormar.

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

Resultat

Tillstånd StormsWithCropDamage
IOWA 359
NEBRASKA 201
MISSISSIPPI 105
NORTH CAROLINA 82
MISSOURI 78

Gruppera data i intervall

Om du vill aggregera efter numeriska värden eller tidsvärden vill du först gruppera data i intervall med hjälp av funktionen bin(). Med kan bin() du förstå hur värden distribueras inom ett visst intervall och göra jämförelser mellan olika perioder.

Följande fråga räknar antalet stormar som orsakade skördeskador för varje vecka under 2007. Argumentet 7d representerar en vecka eftersom funktionen kräver ett giltigt tidsintervallvärde .

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

Resultat

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
... ...

Lägg till | render timechart i slutet av frågan för att visualisera resultatet.

Skärmbild av diagrammet beskärningsskador per vecka som renderades av föregående fråga.

Anteckning

bin() liknar funktionen floor() i andra programmeringsspråk. Det minskar varje värde till närmaste multipel av modulus som du anger och gör det möjligt summarize att tilldela raderna till grupper.

Beräkna min, max, genomsnitt och summa

Om du vill veta mer om typer av stormar som orsakar skördeskador beräknar du min(), max()och avg() beskärningsskador för varje händelsetyp och sorterar sedan resultatet efter den genomsnittliga skadan.

Observera att du kan använda flera aggregeringsfunktioner i en enda summarize operator för att skapa flera beräknade kolumner.

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

Resultat

Eventtype MaxCropDamage MinCropDamage AvgCropDamage
Frost/frysning 568600000 3000 9106087.5954198465
Wildfire 21000000 10000 7268333.333333333
Torka 700000000 2000 6763977.8761061952
Översvämning 500000000 1000 4844925.23364486
Åska vind 22000000 100 920328.36538461538
... ... ... ...

Resultatet av den föregående frågan anger att Frost/Frys-händelser i genomsnitt orsakade flest beskärningsskador. Bin()-frågan visade dock att händelser med skördeskador till största delen ägde rum under sommarmånaderna.

Använd sum() för att kontrollera det totala antalet skadade grödor i stället för mängden händelser som orsakade viss skada, som i count() föregående bin()-fråga.

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

Skärmbild av tidsdiagram som visar beskärningsskador per vecka.

Nu kan du se en topp i skördeskador i januari, som förmodligen berodde på Frost / Frys.

Tips

Använd minif(), maxif(), avgif()och sumif() för att utföra villkorsstyrda aggregeringar, som vi gjorde i avsnittet med villkorsstyrda rader .

Beräkna procentandelar

Genom att beräkna procentandelar kan du förstå fördelningen och andelen av olika värden i dina data. Det här avsnittet beskriver två vanliga metoder för att beräkna procentandelar med Kusto-frågespråk (KQL).

Beräkna procentandel baserat på två kolumner

Använd count() och countif för att hitta procentandelen stormhändelser som orsakade beskärningsskador i varje tillstånd. Räkna först det totala antalet stormar i varje tillstånd. Räkna sedan antalet stormar som orsakade skördeskador i varje tillstånd.

Använd sedan extend för att beräkna procentandelen mellan de två kolumnerna genom att dividera antalet stormar med beskärningsskador med det totala antalet stormar och multiplicera med 100.

För att säkerställa att du får ett decimalresultat använder du funktionen todouble() för att konvertera minst ett av heltalsvärdena till en dubbel innan du utför divisionen.

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

Resultat

Tillstånd TotalStormsInState StormsWithCropDamage PercentWithCropDamage
IOWA 2337 359 15.36
NEBRASKA 1766 201 11.38
MISSISSIPPI 1218 105 8.62
NORTH CAROLINA 1721 82 4.76
MISSOURI 2016 78 3.87
... ... ... ...

Anteckning

Vid beräkning av procentandelar konverterar du minst ett av heltalsvärdena i divisionen med todouble() eller toreal(). Detta säkerställer att du inte får trunkerade resultat på grund av heltalsdelning. Mer information finns i Typregler för aritmetiska åtgärder.

Beräkna procent baserat på tabellstorlek

Om du vill jämföra antalet stormar efter händelsetyp med det totala antalet stormar i databasen sparar du först det totala antalet stormar i databasen som en variabel. Let-instruktioner används för att definiera variabler i en fråga.

Eftersom tabelluttrycksinstruktioner returnerar tabellresultat använder du funktionen toscalar() för att konvertera tabellresultatet för count() funktionen till ett skalärt värde. Sedan kan det numeriska värdet användas i procentberäkningen.

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

Resultat

Eventtype EventCount Procent
Åska vind 13015 22.034673077574237
Hagel 12711 21.519994582331627
Flash Flood 3688 6.2438627975485055
Torka 3616 6.1219652592015716
Vinterväder 3349 5.669928554498358
... ... ...

Extrahera unika värden

Använd make_set() för att omvandla ett urval av rader i en tabell till en matris med unika värden.

Följande fråga använder make_set() för att skapa en matris med de händelsetyper som orsakar dödsfall i varje tillstånd. Den resulterande tabellen sorteras sedan efter antalet stormtyper i varje matris.

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

Resultat

Tillstånd StormTypesWithDeaths
KALIFORNIEN ["Thunderstorm Wind","High Surf","Cold/Wind Chill","Strong Wind","Rip Current","Heat","Excessive Heat","Wildfire","Dust Storm","Astronomical Low Tide","Dense Fog","Winter Weather"]
TEXAS ["Flash Flood","Thunderstorm Wind","Tornado","Lightning","Flood","Ice Storm","Winter Weather","Rip Current","Excessive Heat","Dense Fog","Hurricane (Typhoon)","Cold/Wind Chill"]
OKLAHOMA ["Flash Flood","Tornado","Cold/Wind Chill","Winter Storm","Heavy Snow","Excessive Heat","Heat","Ice Storm","Winter Weather","Dense Fog"]
NEW YORK ["Flood","Lightning","Thunderstorm Wind","Flash Flood","Winter Weather","Ice Storm","Extreme Cold/Wind Chill","Winter Storm","Heavy Snow"]
KANSAS ["Thunderstorm Wind","Heavy Rain","Tornado","Flood","Flash Flood","Lightning","Heavy Snow","Winter Weather","Blizzard"]
... ...

Bucketdata efter villkor

Funktionen case() grupperar data i bucketar baserat på angivna villkor. Funktionen returnerar motsvarande resultatuttryck för det första uppfyllda predikatet, eller det sista andra uttrycket om inget av predikaten är uppfyllt.

Det här exemplet grupperar stater baserat på antalet stormrelaterade skador som deras medborgare lidit.

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

Resultat

Tillstånd InjuriesCount SkadorBucket
ALABAMA 494 Stor
ALASKA 0 Inga skador
AMERIKANSKA SAMOA 0 Inga skador
ARIZONA 6 Liten
ARKANSAS 54 Stor
NORDATLANT 15 Medel
... ... ...

Skapa ett cirkeldiagram för att visualisera andelen tillstånd som drabbats av stormar som resulterar i ett stort, medelstort eller litet antal skador.

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 

Skärmbild av Azure Data Explorer cirkeldiagram för webbgränssnitt som renderades av föregående fråga.

Utföra aggregeringar över ett skjutfönster

I följande exempel visas hur du sammanfattar kolumner med hjälp av ett skjutfönster.

Frågan beräknar minsta, högsta och genomsnittliga egendomsskador för tornados, översvämningar och skogsbränder med ett skjutfönster på sju dagar. Varje post i resultatuppsättningen aggregerar de föregående sju dagarna och resultaten innehåller en post per dag under analysperioden.

Här är en stegvis förklaring av frågan:

  1. Gruppera varje post till en enda dag i förhållande till windowStart.
  2. Lägg till sju dagar i bin-värdet för att ange slutet på intervallet för varje post. Om värdet ligger inom intervallet windowStart för och windowEndjusterar du värdet därefter.
  3. Skapa en matris med sju dagar för varje post, med början från postens aktuella dag.
  4. Expandera matrisen från steg 3 med mv-expand för att duplicera varje post till sju poster med endagsintervall mellan dem.
  5. Utför aggregeringarna för varje dag. På grund av steg 4 sammanfattar det här steget faktiskt de föregående sju dagarna.
  6. Undanta de första sju dagarna från slutresultatet eftersom det inte finns någon sjudagarsperiod för dem.
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

Resultat

Följande resultattabell trunkeras. Kör frågan om du vill se fullständiga utdata.

Timestamp Eventtype min_DamageProperty max_DamageProperty avg_DamageProperty
2007-07-08T00:00:00Z Tornado 0 30000 6905
2007-07-08T00:00:00Z Översvämning 0 200000 9261
2007-07-08T00:00:00Z Wildfire 0 200000 14033
2007-07-09T00:00:00Z Tornado 0 100000 14783
2007-07-09T00:00:00Z Översvämning 0 200000 12529
2007-07-09T00:00:00Z Wildfire 0 200000 14033
2007-07-10T00:00:00Z Tornado 0 100000 31400
2007-07-10T00:00:00Z Översvämning 0 200000 12263
2007-07-10T00:00:00Z Wildfire 0 200000 11694
... ... ...

Nästa steg

Nu när du är bekant med vanliga frågeoperatorer och aggregeringsfunktioner går du vidare till nästa självstudie och lär dig hur du kopplar data från flera tabeller.