練習 - 使用 let 陳述式引進變數
我們已使用氣象資料集來彙總資料並將其視覺化。 在這裡,您將了解如何使用 let
陳述式來引進變數和組織複雜的查詢。
let
陳述式可用來將複雜運算式分成多個組件、定義查詢主體之外的常數以利辨讀,或定義變數一次再於查詢內使用多次。 您可以使用 let
陳述式來建立組織完善的複雜查詢。 您可以使用多個 let
陳述式;每個陳述式後面都必須接一個分號 (;
)。
您可以在不同類型的情況下使用 let
陳述式。 最簡單的程度是,您可以定義純量值以供稍後在查詢中參考,例如 int、字串、日期/時間或任何其他值。 您可以為資料表建立篩選過的表格式檢視,以作為查詢的表格式輸入。 您也可以使用 let
陳述式來建立函式。
使用 let
陳述式來定義純量
請回想一下先前以地點或最低災損金額為條件來進行篩選的查詢。 讓我們在查詢開頭處使用 let
陳述式來定義這些界限值。
下列查詢會使用兩個 let
陳述式來定義純量值以供稍後在查詢中作為輸入參數。 所定義的第一個值是數字,第二個值是字串。 let
陳述式會以分號作為結尾。
請注意查詢中以雙正斜線 (//
) 開頭的註解化部分。 雙正斜線可指出註解從開頭到行尾的內容。 這些內容是執行查詢時會忽略的註解。
執行下列查詢:
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
陳述式內使用 toscalar
將表格式結果轉換為純量值
接下來,讓我們以時間的函式看看最常見的事件類型計數。 首先,您必須找出最常見的事件類型是什麼。 之後,您會在查詢中用到此值。 使用 StormEvents 資料表,藉由計算每個類型內的事件數目,來尋找最常見的 EventType。 使用 project
運算子,只傳回 EventType 資料行。
開始建構 let
陳述式之前,請先執行查詢來找出這個事件究竟是什麼。 這可讓您確認查詢所產生的結果符合預期。
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType
您應該會取得如下圖所示的結果:
您會注意到查詢產生的表格式結果有一個資料行和一個資料列。 不過,您可以將此結果轉換成純量值,以作為主要查詢中的篩選值。 首先,將想要引進的變數名稱定義為 MostFrequentEventType。 接下來,您可以將整個查詢放到 toscalar()
函式內,以將表格式結果轉換成純量值。
前面的步驟會彙總為下列 let
陳述式:
let MostFrequentEventType = toscalar(
StormEvents
| summarize count() by EventType
| top 1 by count_
| project EventType);
請注意,這個陳述式本身不是有效的查詢,因為有效的查詢至少必須包含一個不是 let
陳述式的陳述式。 不過,您可以在查詢中使用這個預存純量值。 請回想一下,您想要以時間的函式看看最常見的事件時間計數。 您將以 MostFrequentEventType 進行篩選,然後依特定時間間隔來彙總計數。
在這個情況下,讓我們看看每個月的結果。 您會使用 startofmonth()
函式,以傳回代表指定日期值月份開始的日期時間。 在此查詢中,您會使用 StartTime 資料行作為 startofmonth()
函式的輸入。
最後,將結果轉譯為直條圖,以取得依月份作為間隔的最常見事件類型計數長條圖。
執行下列查詢:
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
陳述式
前面的範例建立了預存純量值來作為查詢中的輸入參數。 不過,您也可以使用 let
陳述式來建立表格式資料,然後作為查詢的輸入。
篩選 StormEvents 資料表來取得間接或直接造成死亡的事件。 然後,使用
project
運算子傳回資料行的子集。 此陳述式會提供稱為 KillerStorms 的表格式輸出。 使用此let
陳述式作為查詢的起始輸入。let KillerStorms = StormEvents | where DeathsDirect + DeathsIndirect > 0 | project State, EventType, Deaths=DeathsDirect + DeathsIndirect;
然後,您可以使用前面幾個單元學到的一些彙總函式。 執行下列查詢:
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
您應該會取得如下圖所示的結果:
查看結果。 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)};
在下列查詢中使用這個
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
您應該會取得如下圖所示的結果:
花點時間了解結果。 嘗試修改查詢來依災損類型顯示百分比明細,然後重新執行查詢。
查看結果。 百分比代表什麼意思? 請注意,查詢會呼叫 Pcent 函式 (定義於 let
陳述式)。 此函式中使用的輸入是 TotalDamagingEvents 和 TotalEvents,這表示您要尋找造成災損的事件百分比。