Share via


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:

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

Screenshot: Gesamtstürme nach Zustandsbalkendiagramm, das mit dem Renderoperator erstellt wurde.

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.

Screenshot des Diagramms

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

Screenshot: Zeitdiagramm mit Ernteschäden nach Woche

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 

Screenshot: Kreisdiagramm der Azure Data Explorer-Webbenutzeroberfläche, das von der vorherigen Abfrage gerendert wurde

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:

  1. Speichern Sie jeden Datensatz relativ zu windowStarteinem einzelnen Tag.
  2. 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, windowEndpassen Sie den Wert entsprechend an.
  3. Erstellen Sie ein Array von sieben Tagen für jeden Datensatz, beginnend mit dem aktuellen Tag des Datensatzes.
  4. Erweitern Sie das Array aus Schritt 3 mit mv-expand , um jeden Datensatz auf sieben Datensätze mit Intervallen von einem Tag zu duplizieren.
  5. Führen Sie die Aggregationen für jeden Tag aus. Aufgrund von Schritt 4 werden in diesem Schritt die letzten sieben Tage zusammengefasst.
  6. 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.