演習 - let ステートメントを使用して変数を導入する

完了

気象データセットを使用して、データの集計と視覚化を行いました。 ここでは、let ステートメントを使用して変数を導入し、複雑なクエリを整理する方法について説明します。

let ステートメントは、複雑な式を複数の部分に分割したり、読みやすくするためにクエリ本体の外部で定数を定義したり、変数を 1 回定義してクエリ内で複数回使用したりする場合に便利です。 let ステートメントを使って、適切に整理された複雑なクエリを作成できます。 複数の let ステートメントを使用できます。各ステートメントの後にセミコロン (;) を付ける必要があります。

let ステートメントは、さまざまな種類の状況で使用できます。 最も単純なレベルでは、後でクエリで参照されるスカラー値 (int、文字列、日付と時刻、その他の値など) を定義できます。 クエリの表形式の入力として使用される、テーブルに対して表形式のフィルター処理が行われたビューを作成できます。 let ステートメントを使用して関数を作成することもできます。

let ステートメントを使用してスカラーを定義する

以前のクエリは、場所または最小の損害でフィルター処理されたことを思い出してください。 クエリの先頭で let ステートメントを使用して、これらの境界値を定義してみましょう。

次のクエリでは、2 つの let ステートメントを使用して、後でクエリの入力パラメーターとして使用されるスカラー値を定義します。 最初に定義された値は数値で、2 番目の値は文字列です。 let ステートメントはすべてセミコロンで終了します。

二重スラッシュ (//) で始まるクエリのコメントアウト部分に注目してください。 二重スラッシュは、行の末尾まで続くコメントの先頭を示します。 これらは、クエリの実行時に無視されるコメントです。

  1. 次のクエリを実行します。

    クエリを実行する

    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
    

    次の画像のような結果が得られるはずです。

    Screenshot of query using the let statement and its results.

  2. 状態名または最小の損害の数を変更して、クエリを再実行してみてください。 結果はどのように変わりますか。

let ステートメント内で toscalar を使用して表形式の結果をスカラー値に変換する

次に、時間の関数として最も頻繁に発生するイベントの種類の数を見てみましょう。 まず、最も頻繁に発生するイベントの種類を把握する必要があります。 次に、この値をクエリで使用します。 StormEvents テーブルを使用して、各種類のイベントの数をカウントして上位の EventType を検索します。 EventType 列のみを返すには、project 演算子を使用します。

let ステートメントの作成を開始する前に、クエリを実行して、このイベントが実際になにであるかを確認します。 これにより、クエリによって期待される結果が生成されていることを確認できます。

クエリを実行する

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

次の画像のような結果が得られるはずです。

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

クエリによって、1 つの列と 1 つの行を含む表形式の結果が生成されたことがわかります。 ただし、これをスカラー値に変換して、メイン クエリのフィルター値として使用する必要があります。 最初に、導入する変数名を MostFrequentEventType として定義します。 次に、クエリ全体を toscalar() 関数内に配置して、表形式の結果をスカラー値に変換します。

前の手順は、次 let のステートメントにまとめられています。

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

有効なクエリには、let ステートメントではないステートメントが少なくとも 1 つ含まれている必要があるため、このステートメント自体は有効なクエリではないことに注意してください。 ただし、この格納されたスカラー値はクエリで使用できます。 最も頻繁なイベント時間の数を時間の関数として見たいということを思い出してください。 MostFrequentEventType でフィルター処理し、特定のタイム ビンごとにカウントを集計します。

この場合は、1 か月あたりの結果を見てみましょう。 startofmonth() 関数を使用します。これは、指定された日付値の月の開始を表す datetime を返します。 このクエリでは、startofmonth() 関数の入力として StartTime 列を使用します。

最後に、結果を縦棒グラフとしてレンダリングし、月ごとにビン分割された最も頻繁なイベントの種類の数のヒストグラムを取得します。

  1. 次のクエリを実行します。

    クエリを実行する

    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
    

    次の画像のような結果が得られるはずです。

    Screenshot of let query using complicated scalar and results.

  2. 月単位でビン分割された最も頻度の低いイベントの種類のヒストグラムを表示するようにクエリを変更し、クエリを再実行してみてください。

表形式の出力を使用して let ステートメントを作成する

前の例では、クエリの入力パラメーターとして使用する格納されたスカラー値を作成しました。 ただし、let ステートメントを使用して表形式データを作成し、クエリへの入力として使用することもできます。

  1. 間接的または直接的に死亡の原因となったイベントに対して StormEvents テーブルをフィルター処理します。 次に、project 演算子を使用して列のサブセットを返します。 このステートメントは、KillerStorms という表形式の出力を提供します。 クエリの開始入力としてこの let ステートメントを使用します。

    let KillerStorms =
        StormEvents
        | where DeathsDirect + DeathsIndirect > 0
        | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
    
  2. その後、前のユニットで学習した集計関数の一部を使用できます。 次のクエリを実行します。

    クエリを実行する

    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
    

    次の画像のような結果が得られるはずです。

    Screenshot of tabular let statement and results.

  3. 結果を確認します。 DistinctKillerEventTypes 列にまとめられているすべてのイベントは、いわゆる "死者が発生した暴風雨" ですか。

let ステートメントを使用してユーザー定義関数を作成する

let ステートメントを使用して、再利用可能なサブクエリであるユーザー定義関数を定義することもできます。 各イベントの種類の損害を引き起こした割合を把握したいとします。 パーセンテージを計算するユーザー定義関数を作成し、後でこの関数を呼び出して、パーセンテージの計算に使用する列を指定します。

let ステートメント内では、次の一般的な構文を使用して関数名、引数、本文を宣言します。

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

具体的には、ユーザー定義関数を使用してパーセンテージを計算します。 最初に、データ型と入力引数を定義します。 この例では、次の引数を使用します。

引数名 データ型 説明
portion real 割合を計算するイベント合計の一部分。
total real イベントの総数。

round() 関数を使用して、回答を小数点以下 2 桁に丸めます。

全体として、let ステートメントによって記述されるユーザー定義関数は次のとおりです。

let Pcent = (portion:real, total:real){round(100 * portion / total, 2)};
  1. 次のクエリでこの let ステートメントを使用します。

    クエリを実行する

    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
    

    次の画像のような結果が得られるはずです。

    Screenshot of let statement with results.

  2. ここで、結果について理解しておきましょう。 損害の種類別の割合の内訳を表示するようにクエリを変更し、クエリを再実行してみてください。

結果を確認します。 パーセンテージはどういう意味を持ちますか。 クエリは、let ステートメントで定義した Pcent 関数を呼び出していることに注意してください。 この関数で使用される入力は TotalDamagingEventsTotalEvents です。つまり、損傷の原因となったイベントの割合を求めています。