Übung: Einführen von Variablen mithilfe der „Let“-Anweisung
Wir haben ein meteorologisches Dataset für die Aggregation und Visualisierung von Daten verwendet. Hier erfahren Sie, wie Sie let
-Anweisungen verwenden, um Variablen einzuführen und komplexe Abfragen zu organisieren.
let
-Anweisungen sind nützlich, um einen komplexen Ausdruck in mehrere Teile aufzuteilen, Konstanten aus Gründen der Lesbarkeit außerhalb des Abfragetexts zu definieren oder eine Variable nur einmal zu definieren und sie mehrmals innerhalb einer Abfrage zu verwenden. Sie können let
-Anweisungen verwenden, um gut strukturierte komplexe Abfragen zu erstellen. Sie können mehrere let
-Anweisungen verwenden. Jede Anweisung muss mit einem Semikolon (;
) abgeschlossen werden.
Sie können let
-Anweisungen in verschiedenen Situationen verwenden. Auf der einfachsten Ebene können Sie Skalarwerte definieren, auf die später in einer Abfrage verwiesen wird, z. B. eine Ganzzahl, Zeichenfolge, Datum/Uhrzeit oder einen anderen Wert. Sie können eine tabellarische gefilterte Ansicht einer Tabelle erstellen, die als tabellarische Eingabe für die Abfrage verwendet wird. Außerdem können Sie mithilfe einer let
-Anweisung auch eine Funktion erstellen.
Definieren eines Skalars mit einer let
-Anweisung
Erinnern Sie sich daran, dass wir frühere Abfragen nach Standorten oder minimalem Schaden gefiltert haben. Definieren wir diese Grenzwerte mithilfe einer let
-Anweisung am Anfang der Abfrage.
Die folgende Abfrage verwendet zwei let
-Anweisungen zum Definieren von Skalarwerten, die später als Eingabeparameter in der Abfrage verwendet werden. Der erste definierte Wert ist eine Zahl und der zweite ist eine Zeichenfolge. Die let
-Anweisungen werden mit einem Semikolon abgeschlossen.
Beachten Sie die auskommentierten Teile der Abfrage, die mit doppelten Schrägstrichen beginnen (//
). Doppelte Schrägstriche zeigen den Beginn eines Kommentars bis zum Ende der Zeile an. Diese Kommentare werden beim Ausführen von Abfragen ignoriert.
Führen Sie die folgende Abfrage aus:
let MinDamage = 1; // int let EventLocation = "ARIZONA"; // string StormEvents | where State == EventLocation | where DamageCrops + DamageProperty >= MinDamage | summarize Damage=round(avg(DamageProperty + DamageCrops)) by EventType | sort by Damage
Sie sollten Ergebnisse erhalten, die wie in der folgenden Abbildung aussehen:
Versuchen Sie, den Namen des Bundesstaats oder die Zahlen für den geringsten Schaden zu ändern und die Abfrage erneut zu ausführen. Wie ändern sich die Ergebnisse?
Konvertieren eines tabellarischen Ergebnisses in einen Skalarwert mit toscalar
in einer let
-Anweisung
Sehen wir uns als Nächstes die Anzahl der häufigsten Ereignistypen als Funktion der Zeit an. Zunächst müssen Sie herausfinden, welches der häufigste Ereignistyp ist. Anschließend verwenden Sie diesen Wert in einer Abfrage. Verwenden Sie die Tabelle StormEvents, um den häufigsten EventType zu finden, indem Sie die Anzahl der Ereignisse innerhalb jedes Typs zählen. Verwenden Sie den project
-Operator, um nur die EventType-Spalte zurückzugeben.
Bevor Sie mit dem Erstellen der let
-Anweisung beginnen, führen Sie die Abfrage aus, um herauszufinden, was dieses Ereignis ist. Dadurch können Sie überprüfen, ob Ihre Abfrage die erwarteten Ergebnisse liefert.
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
Sie sollten Ergebnisse erhalten, die wie in der folgenden Abbildung aussehen:
Sie werden feststellen, dass die Abfrage ein tabellarisches Ergebnis mit einer Spalte und einer Zeile erzeugt hat. Sie möchten dies jedoch in einen Skalarwert umwandeln, um ihn als Filterwert in Ihrer Hauptabfrage zu verwenden. Definieren Sie zunächst den Variablennamen, den wir einführen möchten, als MostFrequentEventType. Anschließend bietet es sich an, das tabellarische Ergebnis in einen Skalarwert zu konvertieren, indem Sie die gesamte Abfrage innerhalb der toscalar()
-Funktion platzieren.
Die vorherigen Schritte sind in der folgenden let
-Anweisung zusammengefasst:
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
Beachten Sie, dass diese Anweisung selbst keine gültige Abfrage ist, da eine gültige Abfrage mindestens eine Anweisung enthalten muss, die keine let
-Anweisung ist. Jedoch können Sie diesen gespeicherten Skalarwert in einer Abfrage verwenden. Machen Sie sich klar, dass Sie die Anzahl der am häufigsten eintretenden Ereignisse als Funktion der Zeit darstellen möchten. Sie filtern nach MostFrequentEventType und addieren die Anzahl dann für ein bestimmtes Zeitintervall.
Sehen wir uns in diesem Fall die Ergebnisse pro Monat an. Sie verwenden die startofmonth()
-Funktion, die eine Datumszeit zurückgibt, die den Beginn des Monats für den angegebenen Datumswert darstellt. In dieser Abfrage verwenden Sie die StartTime-Spalte als Eingabe für die startofmonth()
-Funktion.
Rendern Sie schließlich die Ergebnisse als Säulendiagramm, um ein Histogramm der Anzahl des am häufigsten eingetretenen Ereignistyps zu erhalten, nach Monatsintervallen aufgeschlüsselt.
Führen Sie die folgende Abfrage aus:
let MostFrequentEventType = toscalar( StormEvents | summarize count() by EventType | top 1 by count_ | project EventType); StormEvents | where EventType == MostFrequentEventType | summarize count() by startofmonth(StartTime) | render columnchart
Sie sollten Ergebnisse erhalten, die wie in der folgenden Abbildung aussehen:
Versuchen Sie, die Abfrage so zu ändern, dass ein Histogramm des am wenigsten häufig auftretenden Ereignistyps angezeigt wird, nach Monaten aufgeschlüsselt, und die Abfrage erneut auszuführen.
Erstellen einer let
-Anweisung mit tabellarischer Ausgabe
In den vorherigen Beispielen wurde ein gespeicherter Skalarwert erstellt, der als Eingabeparameter in einer Abfrage verwendet werden soll. Es ist jedoch auch möglich, eine let
-Anweisung zum Erstellen tabellarischer Daten zu verwenden, die dann als Eingabe für eine Abfrage dienen.
Filtern Sie die Tabelle StormEvents nach Ereignissen, die indirekt oder direkt zu Todesfällen geführt haben. Geben Sie dann mithilfe des
project
-Operators eine Teilmenge der Spalten zurück. Diese Anweisung ergibt eine tabellarische Ausgabe namens KillerStorms. Verwenden Sie dieselet
-Anweisung als Anfangseingabe für Ihre Abfrage.let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
Anschließend können Sie einige der Aggregationsfunktionen verwenden, die Sie in früheren Einheiten gelernt haben. Führen Sie die folgende Abfrage aus:
let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect; KillerStorms | summarize DistinctKillerEventTypes=dcount(EventType), TotalDeaths=sum(Deaths) by State | sort by TotalDeaths
Sie sollten Ergebnisse erhalten, die wie in der folgenden Abbildung aussehen:
Sehen Sie sich die Ergebnisse an. Sind alle Ereignisse, die im der Spalte DistinctKillerEventTypes zusammengefasst werden, sogenannte „Killerstürme“?
Erstellen einer benutzerdefinierten Funktion mit der let
-Anweisung
Sie können let
-Anweisungen auch verwenden, um benutzerdefinierte Funktionen zu definieren, die wiederverwendbare Unterabfragen darstellen. Angenommen, Sie möchten herausfinden, welcher Prozentsatz der einzelnen Ereignistypen Schäden verursacht hat. Sie erstellen eine benutzerdefinierte Funktion, die Prozentsätze berechnet, rufen diese Funktion später auf und geben an, welche Spalten zum Berechnen des Prozentsatzes verwendet werden sollen.
In einer let
-Anweisung deklarieren Sie den Funktionsnamen, Argumente und den Textkörper gemäß der folgenden allgemeinen Syntax:
let function=(argument1:datatype, argument2:datatype) {functionbody};
Insbesondere verwenden Sie eine benutzerdefinierte Funktion, um Prozentsätze zu berechnen. Definieren Sie zuerst den Datentyp und die Eingabeargumente. In diesem Beispiel verwenden Sie die folgenden Argumente:
Argumentname | Datentyp | BESCHREIBUNG |
---|---|---|
portion | real |
Der Anteil an den Gesamtereignissen, für den Sie den Prozentsatz berechnen möchten. |
total | real |
Die Gesamtzahl der Ereignisse. |
Sie runden die Antwort mithilfe der round()
-Funktion auf zwei Dezimalstellen.
Kombiniert lautet die durch die let
-Anweisung beschriebene benutzerdefinierte Funktion:
let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
Verwenden Sie diese
let
-Anweisung in der folgenden Abfrage:let Pcent = (portion: real, total: real) { round(100 * portion / total, 2) }; StormEvents | extend Damage = DamageCrops + DamageProperty | summarize TotalEvents = count(), TotalDamagingEvents = countif(Damage > 0) by EventType | project EventType, TotalDamagingEvents, TotalEvents, Percentage = Pcent(TotalDamagingEvents, TotalEvents) | sort by EventType asc
Sie sollten Ergebnisse erhalten, die wie in der folgenden Abbildung aussehen:
Nehmen Sie sich einen Moment Zeit, um die Ergebnisse zu verstehen. Versuchen Sie, die Abfrage so zu ändern, dass eine Aufschlüsselung des Prozentsatzes nach Schadensart dargestellt wird, und führen Sie die Abfrage erneut aus.
Sehen Sie sich die Ergebnisse an. Was bedeutet der Prozentsatz? Beachten Sie, dass die Abfrage die Pcent-Funktion aufruft, die wir in der let
-Anweisung definiert haben. Die in dieser Funktion verwendeten Eingaben sind TotalDamagingEvents und TotalEvents, was bedeutet, dass Sie nach dem Prozentsatz der Ereignisse suchen, die Schäden verursacht haben.