Zelfstudie: aggregatiefuncties gebruiken
Met aggregatiefuncties kunt u gegevens uit meerdere rijen groepeert en combineren in een samenvattingswaarde. De samenvattingswaarde is afhankelijk van de gekozen functie, bijvoorbeeld een aantal, maximum of gemiddelde waarde.
In deze zelfstudie leert u het volgende:
In de voorbeelden in deze zelfstudie wordt de StormEvents
tabel gebruikt, die openbaar beschikbaar is in het Help-cluster. Als u wilt verkennen met uw eigen gegevens, maakt u uw eigen gratis cluster.
Deze zelfstudie bouwt voort op de basis van de eerste zelfstudie, Algemene operators leren.
Vereisten
- Een Microsoft-account of Azure Active Directory-gebruikersidentiteit om u aan te melden bij het Help-cluster
De samenvattende operator gebruiken
De samenvattende operator is essentieel voor het uitvoeren van aggregaties voor uw gegevens. De summarize
operator groepeert rijen op basis van de by
component en gebruikt vervolgens de opgegeven aggregatiefunctie om elke groep in één rij te combineren.
Zoek het aantal gebeurtenissen op status met behulp van summarize
de aggregatiefunctie count .
StormEvents
| summarize TotalStorms = count() by State
Uitvoer
Staat | TotalStorms |
---|---|
TEXAS | 4701 |
KANSAS | 3166 |
IOWA | 2337 |
ILLINOIS | 2022 |
MISSOURI | 2016 |
... | ... |
Queryresultaten visualiseren
Het visualiseren van queryresultaten in een grafiek of grafiek kan u helpen patronen, trends en uitbijters in uw gegevens te identificeren. U kunt dit doen met de operator renderen .
In de zelfstudie ziet u voorbeelden van hoe u kunt gebruiken render
om uw resultaten weer te geven. Laten we nu gebruiken render
om de resultaten van de vorige query in een staafdiagram te bekijken.
StormEvents
| summarize TotalStorms = count() by State
| render barchart
Rijen voorwaardelijk tellen
Wanneer u uw gegevens analyseert, gebruikt u countif() om rijen te tellen op basis van een specifieke voorwaarde om te begrijpen hoeveel rijen voldoen aan de opgegeven criteria.
De volgende query gebruikt countif()
om te tellen van stormen die schade hebben veroorzaakt. De query gebruikt vervolgens de top
operator om de resultaten te filteren en de statussen weer te geven met de hoogste hoeveelheid gewasschade veroorzaakt door stormen.
StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage
Uitvoer
Staat | StormsWithCropDamage |
---|---|
IOWA | 359 |
NEBRASKA | 201 |
MISSISSIPPI | 105 |
NORTH CAROLINA | 82 |
MISSOURI | 78 |
Gegevens groepeer in opslaglocaties
Als u wilt aggregeren op numerieke of tijdwaarden, moet u de gegevens eerst groeperen in bins met behulp van de functie bin(). Met behulp bin()
van kunt u begrijpen hoe waarden worden verdeeld binnen een bepaald bereik en vergelijkingen maken tussen verschillende perioden.
Met de volgende query wordt het aantal stormen geteld dat gewasschade heeft veroorzaakt voor elke week in 2007. Het 7d
argument vertegenwoordigt een week, omdat voor de functie een geldige periodewaarde is vereist.
StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31))
and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)
Uitvoer
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 |
... | ... |
Voeg | render timechart
toe aan het einde van de query om de resultaten te visualiseren.
Notitie
bin()
is vergelijkbaar met de floor()
functie in andere programmeertalen. Het vermindert elke waarde tot het dichtstbijzijnde veelvoud van de modulus die u opgeeft en staat toe summarize
om de rijen toe te wijzen aan groepen.
De min, max, gemiddelde en som berekenen
Voor meer informatie over typen stormen die gewasschade veroorzaken, berekent u de gewasschade min(), max() en avg() voor elk gebeurtenistype en sorteert u het resultaat op basis van de gemiddelde schade.
Houd er rekening mee dat u meerdere aggregatiefuncties in één summarize
operator kunt gebruiken om meerdere berekende kolommen te produceren.
StormEvents
| where DamageCrops > 0
| summarize
MaxCropDamage=max(DamageCrops),
MinCropDamage=min(DamageCrops),
AvgCropDamage=avg(DamageCrops)
by EventType
| sort by AvgCropDamage
Uitvoer
EventType | MaxCropDamage | MinCropDamage | AvgCropDamage |
---|---|---|---|
Vorst/vriezen | 568600000 | 3000 | 9106087.5954198465 |
Wildfire | 21000000 | 10.000 | 7268333.333333333 |
Droogte | 700000000 | 2000 | 6763977.8761061952 |
Overstroming | 500000000 | 1000 | 4844925.23364486 |
Onweerswind | 22000000 | 100 | 920328.36538461538 |
... | ... | ... | ... |
De resultaten van de vorige query geven aan dat vorst/vorstgebeurtenissen gemiddeld de meeste gewasschade hebben opgeleverd. Uit de bin()-query bleek echter dat gebeurtenissen met gewasschade meestal in de zomermaanden plaatsvonden.
Gebruik sum() om het totale aantal beschadigde gewassen te controleren in plaats van het aantal gebeurtenissen dat schade heeft veroorzaakt, zoals in count()
de vorige bin()-query.
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
Nu zie je een piek in de schade aan het gewas in januari, die waarschijnlijk te wijten is aan vorst/vorst.
Tip
Gebruik minif(), maxif(), avgif() en sumif() om voorwaardelijke aggregaties uit te voeren, zoals we hebben gedaan in de sectie voorwaardelijke telling van rijen .
Percentages berekenen
Door percentages te berekenen, krijgt u inzicht in de verdeling en het aandeel van verschillende waarden in uw gegevens. In deze sectie worden twee algemene methoden besproken voor het berekenen van percentages met de Kusto-querytaal (KQL).
Percentage berekenen op basis van twee kolommen
Gebruik count() en countif om het percentage stormgebeurtenissen te vinden dat in elke toestand gewasschade heeft veroorzaakt. Tel eerst het totale aantal stormen in elke staat. Tel vervolgens het aantal stormen dat in elke staat gewasschade heeft veroorzaakt.
Gebruik vervolgens uitbreiden om het percentage tussen de twee kolommen te berekenen door het aantal stormen met materiële schade te delen door het totale aantal stormen en te vermenigvuldigen met 100.
Om ervoor te zorgen dat u een decimaal resultaat krijgt, gebruikt u de functie todouble() om ten minste een van de waarden voor het aantal gehele getallen te converteren naar een dubbele waarde voordat u de deling uitvoert.
StormEvents
| summarize
TotalStormsInState = count(),
StormsWithPropertyDamage = countif(DamageProperty > 0)
by State
| extend PercentWithPropertyDamage =
round((todouble(StormsWithPropertyDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithPropertyDamage
Uitvoer
Staat | TotalStorms | StormsWithCropDamage | PercentWithCropDamage |
---|---|---|---|
TEXAS | 4701 | 1205 | 25.63 |
IOWA | 2337 | 1062 | 45.44 |
OHIO | 1233 | 730 | 59.21 |
GEORGIË | 1983 | 666 | 33.59 |
VIRGINIA | 1647 | 622 | 37.77 |
... | ... | ... | ... |
Notitie
Converteer bij het berekenen van percentages ten minste één van de gehele waarden in de deling met todouble() of toreal(). Dit zorgt ervoor dat u geen afgekapte resultaten krijgt vanwege de deling van gehele getallen. Zie Typeregels voor rekenkundige bewerkingen voor meer informatie.
Percentage berekenen op basis van tabelgrootte
Als u het aantal stormen per gebeurtenistype wilt vergelijken met het totale aantal stormen in de database, slaat u eerst het totale aantal stormen in de database op als een variabele. Let-instructies worden gebruikt om variabelen in een query te definiëren.
Omdat tabellaire expressie-instructies resultaten in tabelvorm retourneren, gebruikt u de functie toscalar() om het resultaat in tabelvorm van de count()
functie te converteren naar een scalaire waarde. Vervolgens kan de numerieke waarde worden gebruikt in de percentageberekening.
let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0
Uitvoer
EventType | EventCount | Percentage |
---|---|---|
Onweerswind | 13015 | 22.034673077574237 |
Hagel | 12711 | 21.519994582331627 |
Flash Flood | 3688 | 6.2438627975485055 |
Droogte | 3616 | 6.1219652592015716 |
Winterweer | 3349 | 5.669928554498358 |
... | ... | ... |
Unieke waarden extraheren
Gebruik make_set() om een selectie van rijen in een tabel om te zetten in een matrix met unieke waarden.
De volgende query gebruikt make_set()
om een matrix te maken van de gebeurtenistypen die in elke status overlijden veroorzaken. De resulterende tabel wordt vervolgens gesorteerd op het aantal stormtypen in elke matrix.
StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)
Uitvoer
Staat | StormTypesWithDeaths |
---|---|
CALIFORNIË | ["Onweerswind","High Surf","Cold/Wind Chill","Strong Wind","Rip Current","Heat","Excessive Heat","Wildfire","Dust Storm","Astronomisch laagtij","Dichte mist","Winterweer"] |
TEXAS | ["Flash Flood","Onweerswind","Tornado","Bliksem","Overstroming","Ijsstorm","Winterweer","Rip current","Overmatige hitte","Dichte mist","Orkaan (tyfoon)","Koud/Wind chill"] |
OKLAHOMA | ["Flash Flood","Tornado","Cold/Wind Chill","Winter Storm","Heavy Snow","Excess Heat","Heat","Ice Storm","Winter Weather","Dense Fog"] |
NEW YORK | ["Overstroming","Bliksem","Onweerswind","Flash Flood","Winterweer","Ijsstorm","Extreme kou/Koude wind","Winterstorm","Zware sneeuw"] |
KANSAS | ["Onweerswind","Zware regen","Tornado","Overstroming","Flash Flood","Bliksem","Zware sneeuw","Winterweer","Blizzard"] |
... | ... |
Bucketgegevens per voorwaarde
De functie case() groepeert gegevens in buckets op basis van opgegeven voorwaarden. De functie retourneert de bijbehorende resultaatexpressie voor het eerste tevreden stellende predicaat of de laatste expressie anders als aan geen van de predicaten wordt voldaan.
In dit voorbeeld worden staten gegroepeerd op basis van het aantal stormgerelateerde letsels dat hun burgers hebben opgelopen.
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
Uitvoer
Staat | BlessuresAantal | BlessuresBucket |
---|---|---|
ALABAMA | 494 | Groot |
ALASKA | 0 | Geen verwondingen |
AMERIKAANS-SAMOA | 0 | Geen verwondingen |
ARIZONA | 6 | Klein |
ARKANSAS | 54 | Groot |
ATLANTISCHE NOORD | 15 | Normaal |
... | ... | ... |
Maak een cirkeldiagram om het percentage staten te visualiseren dat stormen heeft ervaren, wat resulteert in een groot, gemiddeld of klein aantal verwondingen.
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
Aggregaties uitvoeren over een schuifvenster
In het volgende voorbeeld ziet u hoe u kolommen samenvat met behulp van een schuifvenster.
De query berekent de minimale, maximale en gemiddelde materiële schade van tornado's, overstromingen en bosbranden met behulp van een schuifraam van zeven dagen. Elke record in de resultatenset voegt de voorgaande zeven dagen samen en de resultaten bevatten een record per dag in de analyseperiode.
Hier volgt een stapsgewijze uitleg van de query:
- Plaats elke record op één dag ten opzichte van
windowStart
. - Voeg zeven dagen toe aan de bin-waarde om het einde van het bereik voor elke record in te stellen. Als de waarde buiten het bereik van
windowStart
enwindowEnd
valt, past u de waarde dienovereenkomstig aan. - Maak een matrix van zeven dagen voor elke record, beginnend vanaf de huidige dag van de record.
- Vouw de matrix uit stap 3 uit met mv-expand om elke record te dupliceren naar zeven records met intervallen van één dag ertussen.
- Voer de aggregaties voor elke dag uit. Vanwege stap 4 wordt in deze stap de afgelopen zeven dagen samengevat.
- Sluit de eerste zeven dagen uit van het uiteindelijke resultaat, omdat er geen terugblikperiode van zeven dagen voor is.
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
Uitvoer
De volgende resultatentabel is afgekapt. Voer de query uit om de volledige uitvoer te zien.
Tijdstempel | EventType | min_DamageProperty | max_DamageProperty | avg_DamageProperty |
---|---|---|---|---|
2007-07-08T00:00:00Z | Tornado | 0 | 30.000 | 6905 |
2007-07-08T00:00:00Z | Overstroming | 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 | Overstroming | 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 | Overstroming | 0 | 200000 | 12263 |
2007-07-10T00:00:00Z | Wildfire | 0 | 200000 | 11694 |
... | ... | ... |
Volgende stappen
Nu u bekend bent met veelvoorkomende queryoperators en aggregatiefuncties, gaat u verder met de volgende zelfstudie voor meer informatie over het samenvoegen van gegevens uit meerdere tabellen.