Tutorial: Verwenden von Aggregationsfunktionen
Mit Aggregationsfunktionen können Sie Daten aus mehreren Zeilen gruppieren und zu einem Zusammenfassungswert kombinieren. Der Zusammenfassungswert hängt von der ausgewählten Funktion ab, z. B. von einer Anzahl, einem Maximum oder einem Durchschnittswert.
In diesem Tutorial lernen Sie Folgendes:
- Verwenden des summarize-Operators
- Visualisieren von Abfrageergebnissen
- Bedingtes Zählen von Zeilen
- Gruppieren von Daten in Behältern
- Berechnen von min, max, avg und sum
- Berechnen von Prozentsätzen
- Extrahieren eindeutiger Werte
- Bucketdaten nach Bedingung
- Durchführen einer Aggregation über ein gleitendes Fenster
In den Beispielen in diesem Tutorial wird die StormEvents
Tabelle verwendet, die im Hilfecluster öffentlich verfügbar ist. Um mit Ihren eigenen Daten zu untersuchen, erstellen Sie Einen eigenen kostenlosen Cluster.
Dieses Tutorial baut auf der Grundlage des ersten Tutorials learn common operators auf.
Voraussetzungen
- Ein Microsoft-Konto oder Microsoft Entra Benutzeridentität für die Anmeldung beim Hilfecluster
Verwenden des summarize-Operators
Der Summarize-Operator ist wichtig, um Aggregationen für Ihre Daten auszuführen. Der summarize
Operator gruppiert Zeilen basierend auf der by
-Klausel und verwendet dann die bereitgestellte Aggregationsfunktion, um jede Gruppe in einer einzelnen Zeile zu kombinieren.
Suchen Sie die Anzahl der Ereignisse nach Zustand mithilfe summarize
der Aggregationsfunktion für anzahl .
StormEvents
| summarize TotalStorms = count() by State
Ausgabe
State | TotalStorms |
---|---|
TEXAS | 4701 |
KANSAS | 3166 |
IOWA | 2337 |
ILLINOIS | 2022 |
MISSOURI | 2016 |
... | ... |
Visualisieren von Abfrageergebnissen
Die Visualisierung von Abfrageergebnissen in einem Diagramm oder Diagramm kann Ihnen helfen, Muster, Trends und Ausreißer in Ihren Daten zu identifizieren. Dies ist mit dem Renderoperator möglich.
Im gesamten Tutorial sehen Sie Beispiele für die Verwendung render
von zum Anzeigen Ihrer Ergebnisse. Vorerst können wir verwenden render
, um die Ergebnisse der vorherigen Abfrage in einem Balkendiagramm anzuzeigen.
StormEvents
| summarize TotalStorms = count() by State
| render barchart
Bedingtes Zählen von Zeilen
Wenn Sie Ihre Daten analysieren, verwenden Sie countif(), um Zeilen basierend auf einer bestimmten Bedingung zu zählen, um zu verstehen, wie viele Zeilen die angegebenen Kriterien erfüllen.
In der folgenden Abfrage wird verwendet countif()
, um die Stürme zu zählen, die Schäden verursacht haben. Die Abfrage verwendet dann den top
-Operator, um die Ergebnisse zu filtern und die Zustände mit der höchsten Menge an Zuschneideschäden anzuzeigen, die durch Stürme verursacht werden.
StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage
Ausgabe
State | StormsWithCropDamage |
---|---|
IOWA | 359 |
NEBRASKA | 201 |
MISSISSIPPI | 105 |
NORTH CAROLINA | 82 |
MISSOURI | 78 |
Gruppieren von Daten in Behältern
Um nach numerischen werten oder Zeitwerten zu aggregieren, sollten Sie die Daten zunächst mithilfe der bin() -Funktion in Bins gruppieren. Mithilfe von bin()
können Sie verstehen, wie Werte innerhalb eines bestimmten Bereichs verteilt werden, und Vergleiche zwischen verschiedenen Zeiträumen durchführen.
Die folgende Abfrage zählt die Anzahl der Stürme, die 2007 für jede Woche Ernteschäden verursacht haben. Das 7d
Argument stellt eine Woche dar, da die Funktion einen gültigen Zeitraumwert erfordert.
StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31))
and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)
Ausgabe
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 |
... | ... |
Fügen Sie | render timechart
am Ende der Abfrage hinzu, um die Ergebnisse zu visualisieren.
Hinweis
bin()
ähnelt der floor()
Funktion in anderen Programmiersprachen. Sie reduziert jeden Wert auf das nächste Vielfache des angegebenen Modulus und ermöglicht summarize
das Zuweisen der Zeilen zu Gruppen.
Berechnen von min, max, avg und sum
Wenn Sie mehr über die Arten von Stürmen erfahren möchten, die Ernteschäden verursachen, berechnen Sie die Ernteschäden min(), max() und avg() für jeden Ereignistyp, und sortieren Sie dann das Ergebnis nach dem durchschnittlichen Schaden.
Beachten Sie, dass Sie mehrere Aggregationsfunktionen in einem einzelnen summarize
Operator verwenden können, um mehrere berechnete Spalten zu erzeugen.
StormEvents
| where DamageCrops > 0
| summarize
MaxCropDamage=max(DamageCrops),
MinCropDamage=min(DamageCrops),
AvgCropDamage=avg(DamageCrops)
by EventType
| sort by AvgCropDamage
Ausgabe
EventType | MaxCropDamage | MinCropDamage | AvgCropDamage |
---|---|---|---|
Frost/Frieren | 568600000 | 3000 | 9106087.5954198465 |
Wildfire | 21000000 | 10000 | 7268333.333333333 |
Dürre | 700000000 | 2000 | 6763977.8761061952 |
Hochwasser | 500000000 | 1000 | 4844925.23364486 |
Sturm | 22000000 | 100 | 920328.36538461538 |
... | ... | ... | ... |
Die Ergebnisse der vorherigen Abfrage deuten darauf hin, dass Frost/Freeze-Ereignisse im Durchschnitt zu den meisten Ernteschäden geführt haben. Die bin()-Abfrage zeigte jedoch, dass Ereignisse mit Ernteschäden meist in den Sommermonaten stattfanden.
Verwenden Sie sum(), um die Gesamtzahl der beschädigten Kulturen anstelle der Anzahl der Ereignisse zu überprüfen, die schäden verursacht haben, wie in der vorherigen bin()-Abfrage geschehencount()
.
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
Nun sehen Sie einen Höhepunkt der Ernteschäden im Januar, der wahrscheinlich auf Frost/Frost zurückzuführen war.
Tipp
Verwenden Sie minif(), maxif(), avgif(), und sumif(), um bedingte Aggregationen auszuführen, wie wir es im Abschnitt Zeilen mit bedingter Zählung getan haben.
Berechnen von Prozentsätzen
Die Berechnung von Prozentsätzen kann Ihnen helfen, die Verteilung und den Anteil der verschiedenen Werte in Ihren Daten zu verstehen. In diesem Abschnitt werden zwei gängige Methoden zum Berechnen von Prozentsätzen mit dem Kusto-Abfragesprache (KQL) behandelt.
Berechnen des Prozentsatzes basierend auf zwei Spalten
Verwenden Sie count() und countif , um den Prozentsatz der Sturmereignisse zu ermitteln, die Ernteschäden in jedem Zustand verursacht haben. Zählen Sie zunächst die Gesamtzahl der Stürme in jedem Zustand. Zählen Sie dann die Anzahl der Stürme, die Ernteschäden in jedem Zustand verursacht haben.
Verwenden Sie dann extend , um den Prozentsatz zwischen den beiden Spalten zu berechnen, indem Sie die Anzahl der Stürme mit Ernteschäden durch die Gesamtzahl der Stürme dividieren und mit 100 multiplizieren.
Um sicherzustellen, dass Sie ein Dezimalergebnis erhalten, verwenden Sie die Todouble() -Funktion, um mindestens einen der Ganzzahlanzahlwerte vor der Aufteilung in ein Double zu konvertieren.
StormEvents
| summarize
TotalStormsInState = count(),
StormsWithCropDamage = countif(DamageCrops > 0)
by State
| extend PercentWithCropDamage =
round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage
Ausgabe
State | TotalStormsInState | StormsWithCropDamage | PercentWithCropDamage |
---|---|---|---|
IOWA | 2337 | 359 | 15.36 |
NEBRASKA | 1766 | 201 | 11.38 |
MISSISSIPPI | 1.218 | 105 | 8,62 |
NORTH CAROLINA | 1721 | 82 | 4.76 |
MISSOURI | 2016 | 78 | 3,87 |
... | ... | ... | ... |
Hinweis
Konvertieren Sie beim Berechnen von Prozentsätzen mindestens einen der ganzzahligen Werte in der Division mit todouble() oder toreal(). Dadurch wird sichergestellt, dass Sie aufgrund der Ganzzahlteilung keine abgeschnittenen Ergebnisse erhalten. Weitere Informationen finden Sie unter Typregeln für arithmetische Vorgänge.
Berechnen des Prozentsatzes basierend auf der Tabellengröße
Um die Anzahl der Stürme nach Ereignistyp mit der Gesamtzahl der Stürme in der Datenbank zu vergleichen, speichern Sie zunächst die Gesamtzahl der Stürme in der Datenbank als Variable. Let-Anweisungen werden verwendet, um Variablen innerhalb einer Abfrage zu definieren.
Da tabellenbasierte Ausdrucksanweisungen tabellarische Ergebnisse zurückgeben, verwenden Sie die Funktion toscalar(), um das tabellarische Ergebnis der count()
Funktion in einen skalaren Wert zu konvertieren. Anschließend kann der numerische Wert in der Prozentualen Berechnung verwendet werden.
let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0
Ausgabe
EventType | EventCount | Prozentwert |
---|---|---|
Sturm | 13015 | 22.034673077574237 |
Hagel | 12711 | 21.519994582331627 |
Überschwemmung | 3688 | 6.2438627975485055 |
Dürre | 3616 | 6.1219652592015716 |
Winterwetter | 3349 | 5.669928554498358 |
... | ... | ... |
Extrahieren eindeutiger Werte
Verwenden Sie make_set(), um eine Auswahl von Zeilen in einer Tabelle in ein Array eindeutiger Werte umzuwandeln.
Die folgende Abfrage verwendet make_set()
, um ein Array der Ereignistypen zu erstellen, die Todesfälle in jedem Zustand verursachen. Die resultierende Tabelle wird dann nach der Anzahl der Stormtypen in jedem Array sortiert.
StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)
Ausgabe
State | StormTypesWithDeaths |
---|---|
CALIFORNIA | ["Gewitterwind","High Surf","Cold/Wind Chill","Strong Wind","Rip Current","Heat","Exzessive Hitze","Wildfire","Staubsturm","Astronomische Ebbe","Dichte Nebel","Winterwetter"] |
TEXAS | ["Blitzflut","Gewitterwind","Tornado","Blitz","Flut","Eissturm","Winterwetter","Rip Current","Übermäßige Hitze","Dichter Nebel","Hurrikan (Typhoon)","Kälte/Windkälte"] |
OKLAHOMA | ["Flash Flood","Tornado","Cold/Wind Chill","Winter Storm","Heavy Snow","Exzessive Hitze","Hitze","Eissturm","Winterwetter","Dichter Nebel"] |
NEW YORK | ["Flut","Blitz","Gewitterwind","Blitzflut","Winterwetter","Eissturm","Extreme Kälte/Windkälte","Wintersturm","Schwerer Schnee"] |
KANSAS | ["Gewitterwind","Starker Regen","Tornado","Flut","Blitzflut","Blitzflut","Blitz","Schwerer Schnee","Winterwetter","Blizzard"] |
... | ... |
Bucketdaten nach Bedingung
Die case()- Funktion gruppiert Daten basierend auf den angegebenen Bedingungen in Buckets. Die Funktion gibt den entsprechenden Ergebnisausdruck für das erste zufriedene Prädikat oder den letzten Else-Ausdruck zurück, wenn keines der Prädikate erfüllt ist.
In diesem Beispiel werden Zustände basierend auf der Anzahl der sturmbedingten Verletzungen, die ihre Bürger erlitten haben, gruppiert.
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
Ausgabe
State | InjuriesCount | VerletzungenBucket |
---|---|---|
ALABAMA | 494 | Groß |
ALASKA | 0 | Keine Verletzungen |
AMERIKANISCH SAMOA | 0 | Keine Verletzungen |
ARIZONA | 6 | Klein |
ARKANSAS | 54 | Groß |
ATLANTISCHER NORDEN | 15 | Medium |
... | ... | ... |
Erstellen Sie ein Kreisdiagramm, um den Anteil der Zustände zu visualisieren, bei denen Stürme auftreten, die zu einer großen, mittleren oder kleinen Anzahl von Verletzungen führen.
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
Durchführen von Aggregation über ein gleitendes Fenster
Im folgenden Beispiel wird gezeigt, wie Spalten mithilfe eines gleitenden Fensters zusammengefasst werden.
Die Abfrage berechnet den minimalen, maximalen und durchschnittlichen Sachschaden von Tornados, Überschwemmungen und Waldbränden mithilfe eines gleitenden Fensters von sieben Tagen. Jeder Datensatz im Resultset aggregiert die vorangegangenen sieben Tage, und die Ergebnisse enthalten einen Datensatz pro Tag im Analysezeitraum.
Im Folgenden finden Sie eine schrittweise Erläuterung der Abfrage:
- Speichern Sie jeden Datensatz relativ zu
windowStart
einem einzelnen Tag. - Fügen Sie dem Bin-Wert sieben Tage hinzu, um das Ende des Bereichs für jeden Datensatz festzulegen. Wenn sich der Wert außerhalb des Bereichs von
windowStart
befindet,windowEnd
passen Sie den Wert entsprechend an. - Erstellen Sie ein Array von sieben Tagen für jeden Datensatz, beginnend mit dem aktuellen Tag des Datensatzes.
- Erweitern Sie das Array aus Schritt 3 mit mv-expand , um jeden Datensatz auf sieben Datensätze mit Intervallen von einem Tag zu duplizieren.
- Führen Sie die Aggregationen für jeden Tag aus. Aufgrund von Schritt 4 werden in diesem Schritt die letzten sieben Tage zusammengefasst.
- Schließen Sie die ersten sieben Tage vom Endergebnis aus, da es keinen Sieben-Tage-Lookbackzeitraum für sie gibt.
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
Ausgabe
Die folgende Ergebnistabelle wird abgeschnitten. Führen Sie die Abfrage aus, um die vollständige Ausgabe anzuzeigen.
Timestamp | EventType | min_DamageProperty | max_DamageProperty | avg_DamageProperty |
---|---|---|---|---|
2007-07-08T00:00:00Z | Tornado | 0 | 30.000 | 6905 |
2007-07-08T00:00:00Z | Hochwasser | 0 | 200.000 | 9261 |
2007-07-08T00:00:00Z | Wildfire | 0 | 200.000 | 14033 |
2007-07-09T00:00:00Z | Tornado | 0 | 100.000 | 14783 |
2007-07-09T00:00:00Z | Hochwasser | 0 | 200.000 | 12529 |
2007-07-09T00:00:00Z | Wildfire | 0 | 200.000 | 14033 |
2007-07-10T00:00:00Z | Tornado | 0 | 100.000 | 31400 |
2007-07-10T00:00:00Z | Hochwasser | 0 | 200.000 | 12263 |
2007-07-10T00:00:00Z | Wildfire | 0 | 200.000 | 11694 |
... | ... | ... |
Nächster Schritt
Nachdem Sie nun mit gängigen Abfrageoperatoren und Aggregationsfunktionen vertraut sind, fahren Sie mit dem nächsten Tutorial fort, um zu erfahren, wie Sie Daten aus mehreren Tabellen verknüpfen.
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für