Ćwiczenie — wprowadzanie zmiennych przy użyciu instrukcji let

Ukończone

Użyliśmy zestawu danych meteorologicznych do agregacji i wizualizowania danych. W tym miejscu dowiesz się, jak używać let instrukcji do wprowadzania zmiennych i organizowania złożonych zapytań.

let instrukcje są przydatne do podzielenia złożonego wyrażenia na wiele części, definiowania stałych poza treścią zapytania pod kątem czytelności lub definiowania zmiennej raz i wielokrotnego użycia w zapytaniu. Instrukcje umożliwiają let tworzenie dobrze zorganizowanych złożonych zapytań. Można użyć wielu let instrukcji; każda instrukcja musi być zgodna ze średnikiem (;).

Instrukcje można używać let w różnych sytuacjach. Na najprostszym poziomie można zdefiniować wartości skalarne, które później będą przywoływały się w zapytaniu, takie jak int, ciąg, data/godzina lub dowolna inna wartość. Możesz utworzyć tabelaryczny filtrowany widok tabeli, który będzie używany jako dane wejściowe tabelaryczne dla zapytania. Funkcję można również utworzyć przy użyciu instrukcji let .

Definiowanie skalarnego za pomocą instrukcji let

Pamiętaj, że poprzednie zapytania filtrowane według lokalizacji lub minimalnych uszkodzeń. Zdefiniujmy te wartości granic przy użyciu let instrukcji na początku zapytania.

Poniższe zapytanie używa dwóch let instrukcji do definiowania wartości skalarnych, które będą później używane jako parametry wejściowe w zapytaniu. Pierwsza zdefiniowana wartość to liczba, a druga to ciąg. Instrukcje let kończą się średnikiem.

Zwróć uwagę na fragmenty komentarza zapytania, które zaczynają się od podwójnych ukośników (//). Podwójne ukośniki wskazują początek komentarza do końca wiersza. Są to komentarze ignorowane podczas uruchamiania zapytań.

  1. Uruchom poniższe zapytanie:

    Uruchamianie zapytania

    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
    

    Powinny zostać wyświetlone wyniki, które wyglądają jak na poniższej ilustracji:

    Screenshot of query using the let statement and its results.

  2. Spróbuj zmienić nazwę stanu lub minimalną liczbę uszkodzeń i ponownie użyć zapytania. Jak zmieniają się wyniki?

Konwertowanie wyniku tabelarycznego na wartość skalarną przy użyciu toscalar instrukcji let

Następnie przyjrzyjmy się liczbie najczęściej występujących typów zdarzeń jako funkcji czasu. Najpierw należy ustalić, który typ zdarzenia jest najczęściej spotykany. Następnie użyjesz tej wartości w zapytaniu. Użyj tabeli StormEvents, aby znaleźć top EventType przez zliczanie liczby zdarzeń w ramach każdego typu. Użyj operatora , project aby zwrócić tylko kolumnę EventType .

Przed rozpoczęciem konstruowania instrukcji let uruchom zapytanie, aby dowiedzieć się, czym jest to zdarzenie. Dzięki temu można sprawdzić, czy zapytanie generuje oczekiwane wyniki.

Uruchamianie zapytania

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

Powinny zostać wyświetlone wyniki, które wyglądają jak na poniższej ilustracji:

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

Zauważysz, że zapytanie wygenerowało wynik tabelaryczny z jedną kolumną i jednym wierszem. Jednak należy przekonwertować ją na wartość skalarną, która będzie używana jako wartość filtru w zapytaniu głównym. Najpierw zdefiniuj nazwę zmiennej, którą chcemy wprowadzić jako MostFrequentEventType. Następnie chcesz przekonwertować wynik tabelaryczny na wartość skalarną, umieszczając całe zapytanie wewnątrz toscalar() funkcji.

Poprzednie kroki zostały podsumowane w następującej let instrukcji:

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

Zwróć uwagę, że ta instrukcja sama w sobie nie jest prawidłowym zapytaniem, ponieważ prawidłowe zapytanie musi zawierać co najmniej jedną instrukcję, która nie jest instrukcją let . Można jednak użyć tej przechowywanej wartości skalarnej w zapytaniu. Pamiętaj, że chcesz przyjrzeć się liczbie najczęściej występujących zdarzeń jako funkcji czasu. Filtrujesz według wartości MostFrequentEventType, a następnie podsumujesz liczbę według określonego przedziału czasu.

W tym przypadku przyjrzyjmy się wynikom miesięcznie. Użyjesz startofmonth() funkcji , która zwraca datę/godzinę reprezentującą początek miesiąca dla danej wartości daty. W tym zapytaniu użyjesz kolumny StartTime jako danych wejściowych startofmonth() dla funkcji.

Na koniec renderuj wyniki jako wykres kolumnowy, aby uzyskać histogram liczby najczęściej spotykanych typów zdarzeń w danym miesiącu.

  1. Uruchom poniższe zapytanie:

    Uruchamianie zapytania

    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
    

    Powinny zostać wyświetlone wyniki, które wyglądają jak na poniższej ilustracji:

    Screenshot of let query using complicated scalar and results.

  2. Spróbuj zmienić zapytanie, aby wyświetlić histogram najmniej częstego typu zdarzenia binne według miesiąca i ponownie uruchamiając zapytanie.

Konstruowanie instrukcji let z danymi wyjściowymi tabelarycznymi

W poprzednich przykładach utworzono przechowywaną wartość skalarną do użycia jako parametr wejściowy w zapytaniu. Istnieje jednak również możliwość użycia let instrukcji w celu utworzenia danych tabelarycznych, które są następnie używane jako dane wejściowe zapytania.

  1. Przefiltruj tabelę StormEvents pod względem zdarzeń, które pośrednio lub bezpośrednio spowodowały śmierć. Następnie zwróć podzbiór kolumn przy użyciu project operatora . Ta instrukcja udostępnia tabelaryczne dane wyjściowe o nazwie KillerStorms. Użyj tej let instrukcji jako początkowych danych wejściowych dla zapytania.

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. Następnie możesz użyć niektórych funkcji agregacji poznanych w poprzednich lekcjach. Uruchom poniższe zapytanie:

    Uruchamianie zapytania

    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
    

    Powinny zostać wyświetlone wyniki, które wyglądają jak na poniższej ilustracji:

    Screenshot of tabular let statement and results.

  3. Przyjrzyj się wynikom. Czy wszystkie zdarzenia są podsumowane w kolumnie DistinctKillerEventTypes tak zwane "burze zabójców"?

Tworzenie funkcji zdefiniowanej przez użytkownika za pomocą instrukcji let

Można również użyć let instrukcji do definiowania funkcji zdefiniowanych przez użytkownika, które są podzapytaniami wielokrotnego użytku. Załóżmy, że chcesz dowiedzieć się, jaki procent każdego typu zdarzenia spowodował szkody. Utworzysz funkcję zdefiniowaną przez użytkownika, która będzie obliczać wartości procentowe, a później wywoła tę funkcję i określisz, które kolumny mają być używane do obliczenia wartości procentowej.

W instrukcji let zadeklarujesz nazwę funkcji, argumenty i treść przy użyciu następującej składni ogólnej:

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

W szczególności użyjesz funkcji zdefiniowanej przez użytkownika do obliczenia wartości procentowych. Najpierw zdefiniuj typ danych i argumenty wejściowe. W tym przykładzie użyjesz następujących argumentów:

Nazwa argumentu Typ danych opis
Części real Część łącznych zdarzeń, dla których chcesz obliczyć wartość procentową.
Łącznych real Całkowita liczba zdarzeń.

Zaokrąglisz odpowiedź na dwa miejsca dziesiętne przy użyciu round() funkcji .

W sumie zdefiniowana przez użytkownika funkcja opisana przez instrukcję let to:

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. Użyj tej let instrukcji w następującym zapytaniu:

    Uruchamianie zapytania

    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
    

    Powinny zostać wyświetlone wyniki, które wyglądają jak na poniższej ilustracji:

    Screenshot of let statement with results.

  2. Pośmiń chwilę, aby zrozumieć wyniki. Spróbuj zmodyfikować zapytanie, aby wyświetlić podział procentu według typu uszkodzenia i ponowne uruchomienie zapytania.

Przyjrzyj się wynikom. Co oznacza wartość procentowa? Zwróć uwagę, że zapytanie wywołuje funkcję Pcent zdefiniowaną w instrukcji let . Dane wejściowe używane w tej funkcji to TotalDamagingEvents i TotalEvents, co oznacza, że szukasz procentu zdarzeń, które spowodowały uszkodzenie.