Oefening: variabelen introduceren met behulp van de let-instructie

Voltooid

We hebben een meteorologische gegevensset gebruikt om gegevens samen te aggregatie en te visualiseren. Hier leert u hoe let u instructies gebruikt om variabelen te introduceren en complexe query's te organiseren.

let instructies zijn handig voor het opsplitsen van een complexe expressie in meerdere delen, het definiëren van constanten buiten de hoofdtekst van de query voor leesbaarheid of het definiëren van een variabele eenmaal en het meerdere keren gebruiken binnen een query. U kunt instructies gebruiken let om goed georganiseerde complexe query's te maken. U kunt meerdere let instructies gebruiken. Elke instructie moet worden gevolgd door een puntkomma (;).

U kunt instructies in verschillende situaties gebruiken let . Op het eenvoudigste niveau kunt u scalaire waarden definiëren waarnaar later wordt verwezen in een query, zoals een int, tekenreeks, datum/tijd of een andere waarde. U kunt een gefilterde weergave in tabelvorm maken van een tabel die wordt gebruikt als de tabellaire invoer voor de query. U kunt ook een functie maken met behulp van een let instructie.

Een scalaire waarde definiëren met een let instructie

Zoals u weet, zijn eerdere query's gefilterd op locaties of minimale schade. We gaan deze grenswaarden definiëren met behulp van een let instructie aan het begin van de query.

De volgende query maakt gebruik van twee let instructies om scalaire waarden te definiëren die later worden gebruikt als invoerparameters in de query. De eerste gedefinieerde waarde is een getal en de tweede is een tekenreeks. De let instructies eindigen met een puntkomma.

Let op de uitgecommentarieerde gedeelten van de query die beginnen met dubbele slashes (//). Dubbele slashes geven een begin van een opmerking aan tot het einde van de regel. Dit zijn opmerkingen die worden genegeerd bij het uitvoeren van query's.

  1. Voer de volgende query uit.

    De query uitvoeren

    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
    

    U krijgt resultaten die eruitzien als de volgende afbeelding:

    Screenshot of query using the let statement and its results.

  2. Wijzig de statusnaam of de minimale schadenummers en voer de query opnieuw uit. Hoe worden de resultaten gewijzigd?

Een tabellair resultaat converteren naar een scalaire waarde met behulp van toscalar een let instructie

Laten we nu eens kijken naar een telling van het meest voorkomende gebeurtenistype als een functie van tijd. Eerst moet u nagaan wat het meest voorkomende gebeurtenistype is. Vervolgens gebruikt u deze waarde in een query. Gebruik de Tabel StormEvents om het belangrijkste EventType te vinden door het aantal gebeurtenissen binnen elk type te tellen. Gebruik de project operator om alleen de EventType-kolom te retourneren.

Voordat u begint met het maken van de instructie, voert u de let query uit om erachter te komen wat deze gebeurtenis daadwerkelijk is. Hiermee kunt u controleren of uw query de verwachte resultaten produceert.

De query uitvoeren

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

U krijgt resultaten die eruitzien als de volgende afbeelding:

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

U ziet dat de query een tabellair resultaat met één kolom en één rij heeft geproduceerd. U wilt dit echter converteren naar een scalaire waarde om te gebruiken als filterwaarde in uw hoofdquery. Definieer eerst de naam van de variabele die we willen introduceren als MostFrequentEventType. Vervolgens wilt u het tabellaire resultaat converteren naar een scalaire waarde door de hele query in de toscalar() functie te plaatsen.

De vorige stappen worden samengevat in de volgende let instructie:

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

U ziet dat deze instructie op zichzelf geen geldige query is, omdat een geldige query ten minste één instructie moet bevatten die geen let instructie is. U kunt deze opgeslagen scalaire waarde echter gebruiken in een query. Zoals u weet, wilt u kijken naar een telling van de meest voorkomende gebeurtenistijd als een functie van tijd. U filtert op MostFrequentEventType en vat vervolgens het aantal samen op een bepaalde tijdslocatie.

In dit geval bekijken we de resultaten per maand. U gebruikt de startofmonth() functie, die een datum/tijd retourneert die het begin van de maand aangeeft voor de opgegeven datumwaarde. In deze query gebruikt u de kolom StartTime als invoer voor de startofmonth() functie.

Ten slotte geeft u de resultaten weer als een kolomdiagram om een histogram op te halen van het aantal van het meest voorkomende gebeurtenistype dat per maand is binned.

  1. Voer de volgende query uit.

    De query uitvoeren

    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
    

    U krijgt resultaten die eruitzien als de volgende afbeelding:

    Screenshot of let query using complicated scalar and results.

  2. Wijzig de query om een histogram weer te geven van het minst frequente gebeurtenistype dat per maand is binned en voer de query opnieuw uit.

Een instructie maken let met uitvoer in tabelvorm

In de vorige voorbeelden is een opgeslagen scalaire waarde gemaakt die moet worden gebruikt als invoerparameter in een query. Het is echter ook mogelijk om een let instructie te gebruiken om tabellaire gegevens te maken die vervolgens worden gebruikt als invoer voor een query.

  1. Filter de tabel StormEvents op gebeurtenissen die indirect of rechtstreeks doden hebben veroorzaakt. Retourneer vervolgens een subset van de kolommen met behulp van de project operator. Deze instructie geeft een tabellaire uitvoer met de naam KillerStorms. Gebruik deze let instructie als begininvoer voor uw query.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. Vervolgens kunt u enkele van de aggregatiefuncties gebruiken die u in vorige lessen hebt geleerd. Voer de volgende query uit.

    De query uitvoeren

    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
    

    U krijgt resultaten die eruitzien als de volgende afbeelding:

    Screenshot of tabular let statement and results.

  3. Bekijk de resultaten. Worden alle gebeurtenissen samengevat in de kolom DistinctKillerEventTypes , zogenaamde 'killer storms'?

Een door de gebruiker gedefinieerde functie maken met de let instructie

U kunt ook instructies gebruiken let om door de gebruiker gedefinieerde functies te definiëren, die herbruikbare subquery's zijn. Stel dat u wilt bepalen welk percentage van elk gebeurtenistype schade heeft veroorzaakt. U maakt een door de gebruiker gedefinieerde functie die percentages berekent en deze functie later aanroept en opgeeft welke kolommen moeten worden gebruikt om het percentage te berekenen.

Binnen een let instructie declareert u de functienaam, argumenten en hoofdtekst met behulp van de volgende algemene syntaxis:

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

U gebruikt een door de gebruiker gedefinieerde functie om percentages te berekenen. Definieer eerst het gegevenstype en de invoerargumenten. In dit voorbeeld gebruikt u de volgende argumenten:

Argumentnaam Gegevenstype Omschrijving
Gedeelte real Het gedeelte van het totale aantal gebeurtenissen waarvan u het percentage wilt berekenen.
total real Het totale aantal gebeurtenissen.

U rondt het antwoord af op twee decimalen met behulp van de round() functie.

Helemaal genomen is de door de gebruiker gedefinieerde functie die door de let instructie wordt beschreven:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Gebruik deze let instructie in de volgende query:

    De query uitvoeren

    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
    

    U krijgt resultaten die eruitzien als de volgende afbeelding:

    Screenshot of let statement with results.

  2. Neem even de tijd om de resultaten te begrijpen. Wijzig de query om een uitsplitsing van het percentage per schadetype weer te geven en voer de query opnieuw uit.

Bekijk de resultaten. Wat betekent het percentage? U ziet dat de query de Pcent-functie aanroept, die we in de let instructie hebben gedefinieerd. De invoer die in deze functie wordt gebruikt, zijn TotalDamagingEvents en TotalEvents, wat betekent dat u op zoek bent naar het percentage gebeurtenissen dat schade heeft veroorzaakt.