練習 - 使用 let 陳述式引進變數

已完成

我們已使用氣象資料集來彙總資料並將其視覺化。 在這裡,您將了解如何使用 let 陳述式來引進變數和組織複雜的查詢。

let 陳述式可用來將複雜運算式分成多個組件、定義查詢主體之外的常數以利辨讀,或定義變數一次再於查詢內使用多次。 您可以使用 let 陳述式來建立組織完善的複雜查詢。 您可以使用多個 let 陳述式;每個陳述式後面都必須接一個分號 (;)。

您可以在不同類型的情況下使用 let 陳述式。 最簡單的程度是,您可以定義純量值以供稍後在查詢中參考,例如 int、字串、日期/時間或任何其他值。 您可以為資料表建立篩選過的表格式檢視,以作為查詢的表格式輸入。 您也可以使用 let 陳述式來建立函式。

使用 let 陳述式來定義純量

請回想一下先前以地點或最低災損金額為條件來進行篩選的查詢。 讓我們在查詢開頭處使用 let 陳述式來定義這些界限值。

下列查詢會使用兩個 let 陳述式來定義純量值以供稍後在查詢中作為輸入參數。 所定義的第一個值是數字,第二個值是字串。 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
    

    您應該會取得如下圖所示的結果:

    螢幕擷取畫面顯示使用 let 陳述式的查詢及其結果。

  2. 請嘗試變更州名或最低災損金額,然後重新執行查詢。 結果會有什麼變化?

let 陳述式內使用 toscalar 將表格式結果轉換為純量值

接下來,讓我們以時間的函式看看最常見的事件類型計數。 首先,您必須找出最常見的事件類型是什麼。 之後,您會在查詢中用到此值。 使用 StormEvents 資料表,藉由計算每個類型內的事件數目,來尋找最常見的 EventType。 使用 project 運算子,只傳回 EventType 資料行。

開始建構 let 陳述式之前,請先執行查詢來找出這個事件究竟是什麼。 這可讓您確認查詢所產生的結果符合預期。

執行查詢

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

您應該會取得如下圖所示的結果:

螢幕擷取畫面:預覽使用複雜純量的 let 查詢和結果。

您會注意到查詢產生的表格式結果有一個資料行和一個資料列。 不過,您可以將此結果轉換成純量值,以作為主要查詢中的篩選值。 首先,將想要引進的變數名稱定義為 MostFrequentEventType。 接下來,您可以將整個查詢放到 toscalar() 函式內,以將表格式結果轉換成純量值。

前面的步驟會彙總為下列 let 陳述式:

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

請注意,這個陳述式本身不是有效的查詢,因為有效的查詢至少必須包含一個不是 let 陳述式的陳述式。 不過,您可以在查詢中使用這個預存純量值。 請回想一下,您想要以時間的函式看看最常見的事件時間計數。 您將以 MostFrequentEventType 進行篩選,然後依特定時間間隔來彙總計數。

在這個情況下,讓我們看看每個月的結果。 您會使用 startofmonth() 函式,以傳回代表指定日期值月份開始的日期時間。 在此查詢中,您會使用 StartTime 資料行作為 startofmonth() 函式的輸入。

最後,將結果轉譯為直條圖,以取得依月份作為間隔的最常見事件類型計數長條圖。

  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
    

    您應該會取得如下圖所示的結果:

    螢幕擷取畫面:使用複雜純量的 let 查詢和結果。

  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
    

    您應該會取得如下圖所示的結果:

    螢幕擷取畫面顯示表格式 let 陳述式和結果。

  3. 查看結果。 DistinctKillerEventTypes 資料行中所彙總的事件是否都是所謂的「殺手級風暴」?

使用 let 陳述式建立使用者定義的函式

您也可以使用 let 陳述式來定義使用者定義的函式,這些函式是可重複使用的子查詢。 假設您想要了解每個事件類型造成災損的百分比。 您會建立使用者定義的函式來計算百分比,之後再呼叫此函式並指定要用來計算百分比的資料行。

let 陳述式內,您會使用下列一般語法來宣告函式名稱、引數和主體:

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

具體而言,您會使用使用者定義的函式來計算百分比。 首先,定義資料類型和輸入引數。 在此範例中,您會使用下列引數:

引數名稱 資料類型 描述
部分 real 您想要計算百分比的總事件部分。
總計 real 事件總數。

您會使用 round() 函式將答案四捨五入至小數點第二位。

組合在一起後,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
    

    您應該會取得如下圖所示的結果:

    螢幕擷取畫面:let 陳述式和結果。

  2. 花點時間了解結果。 嘗試修改查詢來依災損類型顯示百分比明細,然後重新執行查詢。

查看結果。 百分比代表什麼意思? 請注意,查詢會呼叫 Pcent 函式 (定義於 let 陳述式)。 此函式中使用的輸入是 TotalDamagingEventsTotalEvents,這表示您要尋找造成災損的事件百分比。