Övning – Introducera variabler med hjälp av let-instruktionen

Slutförd

Vi har använt en meteorologisk datamängd för att aggregera och visualisera data. Här får du lära dig hur du använder let instruktioner för att introducera variabler och organisera komplexa frågor.

let -instruktioner är användbara för att dela upp ett komplext uttryck i flera delar, definiera konstanter utanför frågetexten för läsbarhet eller definiera en variabel en gång och använda den flera gånger i en fråga. Du kan använda let instruktioner för att skapa välorganiserade komplexa frågor. Du kan använda flera let instruktioner. Varje instruktion måste följas av ett semikolon (;).

Du kan använda let instruktioner i olika typer av situationer. På den enklaste nivån kan du definiera skalära värden som senare kommer att refereras till i en fråga, till exempel en int, sträng, datum/tid eller något annat värde. Du kan skapa en tabellfiltrerad vy av en tabell som ska användas som tabellindata för frågan. Du kan också skapa en funktion med hjälp av en let -instruktion.

Definiera en skalär med en let instruktion

Kom ihåg att tidigare frågor har filtrerats på platser eller minsta möjliga skada. Nu ska vi definiera dessa gränsvärden med hjälp av en let -instruktion i början av frågan.

Följande fråga använder två let instruktioner för att definiera skalära värden som senare ska användas som indataparametrar i frågan. Det första definierade värdet är ett tal och det andra är en sträng. -uttrycken let slutar med ett semikolon.

Observera de utkommenterade delarna av frågan som börjar med dubbla snedstreck (//). Dubbla snedstreck anger början på en kommentar till slutet av raden. Det här är kommentarer som ignoreras när du kör frågor.

  1. Kör följande fråga:

    Kör frågan

    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
    

    Du bör få resultat som ser ut som följande bild:

    Screenshot of query using the let statement and its results.

  2. Prova att ändra tillståndsnamnet eller minsta antal skador och kör frågan igen. Hur ändras resultatet?

Konvertera ett tabellresultat till ett skalärt värde med hjälp av toscalar en let instruktion

Nu ska vi titta på antalet av de vanligaste händelsetyperna som en funktion av tiden. Först måste du ta reda på vilken som är den vanligaste händelsetypen. Sedan använder du det här värdet i en fråga. Använd tabellen StormEvents för att hitta den översta EventType genom att räkna antalet händelser inom varje typ. Använd operatorn project för att endast returnera kolumnen EventType .

Innan du börjar skapa -instruktionen let kör du frågan för att ta reda på vad den här händelsen faktiskt är. På så sätt kan du kontrollera att frågan genererar det förväntade resultatet.

Kör frågan

StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType

Du bör få resultat som ser ut som följande bild:

Screenshot of preview of let query using complicated scalar and results.

Du kommer att märka att frågan gav ett tabellresultat med en kolumn och en rad. Du vill dock konvertera detta till ett skalärt värde som skalärt värde som ska användas som ett filtervärde i huvudfrågan. Definiera först det variabelnamn som vi vill introducera som MostFrequentEventType. Sedan vill du konvertera tabellresultatet till ett skalärt värde genom att placera hela frågan i toscalar() funktionen.

Föregående steg sammanfattas i följande let instruktion:

let MostFrequentEventType = toscalar(
    StormEvents
    | summarize count() by EventType
    | top 1 by count_
    | project EventType);

Observera att den här instruktionen i sig inte är en giltig fråga eftersom en giltig fråga måste innehålla minst en instruktion som inte är en let -instruktion. Du kan dock använda det här lagrade skalärvärdet i en fråga. Kom ihåg att du vill titta på antalet händelser som är vanligast som en tidsfunktion. Du filtrerar på MostFrequentEventType och sammanfattar sedan antalet med en viss tidsintervall.

I det här fallet ska vi titta på resultatet per månad. Du använder startofmonth() funktionen som returnerar en datetime som representerar början av månaden för det angivna datumvärdet. I den här frågan använder du kolumnen StartTime som indata för startofmonth() funktionen.

Rendera slutligen resultatet som ett stapeldiagram för att få ett histogram över antalet av de vanligaste händelsetyperna som är indelade per månad.

  1. Kör följande fråga:

    Kör frågan

    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
    

    Du bör få resultat som ser ut som följande bild:

    Screenshot of let query using complicated scalar and results.

  2. Prova att ändra frågan för att visa ett histogram av den minst frekventa händelsetypen som är uppdelad efter månad och kör frågan igen.

Skapa en let instruktion med tabellutdata

I föregående exempel skapades ett lagrat skalärt värde som ska användas som indataparameter i en fråga. Men det är också möjligt att använda en let instruktion för att skapa tabelldata som sedan används som indata till en fråga.

  1. Filtrera tabellen StormEvents efter händelser som indirekt eller direkt orsakade dödsfall. Returnera sedan en delmängd av kolumnerna med operatorn project . Den här instruktionen ger tabellutdata som kallas KillerStorms. Använd den här let instruktionen som startindata för din fråga.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. Sedan kan du använda några av de aggregeringsfunktioner som du har lärt dig i tidigare enheter. Kör följande fråga:

    Kör frågan

    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
    

    Du bör få resultat som ser ut som följande bild:

    Screenshot of tabular let statement and results.

  3. Titta på resultaten. Sammanfattas alla händelser i kolumnen DistinctKillerEventTypes så kallade "killer storms"?

Skapa en användardefinierad funktion med instruktionen let

Du kan också använda let instruktioner för att definiera användardefinierade funktioner, som är återanvändbara underfrågor. Anta att du vill ta reda på vilken procent av varje händelsetyp som orsakat skada. Du skapar en användardefinierad funktion som beräknar procentandelar och senare anropar den här funktionen och anger vilka kolumner som ska användas för att beräkna procentandelen.

I en let instruktion deklarerar du funktionsnamn, argument och brödtext med hjälp av följande allmänna syntax:

let function=(argument1:datatype, argument2:datatype) {functionbody};

Mer specifikt använder du en användardefinierad funktion för att beräkna procentandelar. Definiera först datatypen och indataargumenten. I det här exemplet använder du följande argument:

Argumentnamn Datatyp Description
Del real Den del av det totala antalet händelser som du vill beräkna procentandelen av.
summa real Det totala antalet händelser.

Du avrundar svaret till två decimaler med hjälp av round() funktionen .

Den användardefinierade funktion som beskrivs i -instruktionen let är helt och hållet:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Använd den här let instruktionen i följande fråga:

    Kör frågan

    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
    

    Du bör få resultat som ser ut som följande bild:

    Screenshot of let statement with results.

  2. Ta en stund att förstå resultaten. Prova att ändra frågan för att visa en uppdelning av procentandelen efter skadetyp och kör frågan igen.

Ta en titt på resultaten. Vad betyder procentandelen? Observera att frågan anropar funktionen Pcent , som vi definierade i -instruktionen let . Indata som används i den här funktionen är TotalDamagingEvents och TotalEvents, vilket innebär att du letar efter procentandelen händelser som orsakade skador.