教學課程:使用聚合函數

聚合函數 可讓您將數據從多個數據列分組並合併成摘要值。 摘要值取決於所選的函式,例如計數、最大值或平均值。

在本教學課程中,您將了解如何:

本教學課程中的範例會 StormEvents 使用可在 說明 叢集中公開提供的數據表。 若要使用您自己的數據進行探索, 請建立您自己的免費叢集

本教學課程以第一個教學課程 Learn 通用運算子為基礎。

必要條件

  • 用來登入說明叢集的 Microsoft 帳戶或 Microsoft Entra 使用者身分識別

使用摘要運算子

summarize 運算符是對您的數據執行匯總的必要條件。 運算子會 summarize 根據 by 子句將數據列分組在一起,然後使用提供的聚合函數來合併單一數據列中的每一個群組。

使用 summarize計數匯總函數 ,依狀態尋找事件數目。

StormEvents
| summarize TotalStorms = count() by State

輸出

State TotalStorms
德克薩斯州 4701
堪薩斯州 3166
愛荷華州 2337
伊利諾州 2022
密蘇里州 2016
... ...

將查詢結果可視化

在圖表或圖表中可視化查詢結果,可協助您識別數據中的模式、趨勢和極端值。 您可以使用 轉譯 運算符來執行此動作。

在整個教學課程中,您將會看到如何使用 render 來顯示結果的範例。 現在,讓我們使用 render 來查看條形圖中上一個查詢的結果。

StormEvents
| summarize TotalStorms = count() by State
| render barchart

依使用轉譯運算子建立的狀態條形圖總 Storm 螢幕快照。

有條件地計算數據列

分析數據時,請使用 countif () 根據特定條件來計算數據列,以瞭解有多少數據列符合指定的準則。

下列查詢會使用 countif() 來計算造成損毀的 Storm 計數。 然後,查詢會 top 使用 運算符來篩選結果,並顯示由 storms 所造成的最高裁剪損毀狀態。

StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage

輸出

State StormsWithCropDamage
愛荷華州 359
內布拉斯加州 201
密西西比州 105
北卡羅來納州 82
密蘇里州 78

將數據分組為量化

若要依數值或時間值匯總,您必須先使用 bin () 函式將數據分組為 bin。 使用 bin() 可協助您瞭解值在特定範圍內分佈的方式,並在不同期間之間進行比較。

下列查詢會計算在 2007 年每周造成裁剪損毀的 Storm 數目。 自 7d 變數代表一周,因為函式需要有效的 時間範圍 值。

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)

輸出

StartTime EventCount
2007-01-01T00:00:00Z 16
2007-01-08T00:00:00Z 20
2007-01-29T00:00:00Z 8
2007-02-05T00:00:00Z 1
2007-02-12T00:00:00Z 3
... ...

將 新增 | render timechart 至查詢結尾,以可視化方式呈現結果。

依上一個查詢呈現的周時程圖表裁剪損毀螢幕快照。

注意

bin() 類似於 floor() 其他程式設計語言中的函式。 它會將每個值減少為您提供之最接近的模數倍數,並允許 summarize 將數據列指派給群組。

計算最小值、最大值、平均和總和

若要深入瞭解造成裁剪損壞的 storm 類型,請計算每個事件類型的 最小 () max () avg () 裁剪損害,然後依平均損害排序結果。

請注意,您可以在單 summarize 一運算符中使用多個聚合函數來產生數個計算數據行。

StormEvents
| where DamageCrops > 0
| summarize
    MaxCropDamage=max(DamageCrops), 
    MinCropDamage=min(DamageCrops), 
    AvgCropDamage=avg(DamageCrops)
    by EventType
| sort by AvgCropDamage

輸出

EventType MaxCropDamage MinCropDamage AvgCropDamage
水/凍結 568600000 3000 9106087.5954198465
野火 21000000 10000 7268333.333333333
乾旱 700000000 2000 6763977.8761061952
Flood 500000000 1000 4844925.23364486
Thunderstorm Wind 22000000 100 920328.36538461538
... ... ... ...

上一個查詢的結果表示 以平均方式產生最多裁剪損毀的 一般事件。 不過, bin () 查詢 顯示,裁剪損毀的事件大多發生在夏月。

使用 sum () 來檢查損毀的裁剪總數,而不是造成某些損害的事件數量,如同在上一個 bin () 查詢中所做的count()

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize CropDamage = sum(DamageCrops) by bin(StartTime, 7d)
| render timechart

顯示依周裁剪損毀的時間圖表螢幕快照。

現在您可以在 1 月看到裁剪損毀的尖峰,可能是因為 一月/凍結所造成。

提示

使用 minif () maxif () avgif () 和 sumif () 來執行條件式匯總,就像我們在 [條件式計算數據列] 區段中所做的一樣。

計算百分比

計算百分比可協助您了解數據內不同值的分佈和比例。 本節涵蓋使用 Kusto 查詢語言 (KQL) 計算百分比的兩個常見方法。

根據兩個數據行計算百分比

使用 count () countif 來尋找導致每個狀態中裁剪損毀的 Storm 事件百分比。 首先,計算每個狀態中的 Storm 總數。 然後,計算在每個狀態中造成裁剪損毀的 Storm 數目。

然後,使用 extend 來計算兩個數據行之間的百分比,方法是除以暴風雨總數和乘以 100 的暴風雨損毀數目。

若要確保您取得十進位結果,請先使用 todouble () 函式,在執行除法之前,至少將其中一個整數計數值轉換成雙精度浮點數。

StormEvents
| summarize 
    TotalStormsInState = count(),
    StormsWithCropDamage = countif(DamageCrops > 0)
    by State
| extend PercentWithCropDamage = 
    round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage

輸出

State TotalStormsInState StormsWithCropDamage PercentWithCropDamage
愛荷華州 2337 359 15.36
內布拉斯加州 1766 201 11.38
密西西比州 1218 105 8.62
北卡羅來納州 1721 82 4.76
密蘇里州 2016 78 3.87
... ... ... ...

注意

計算百分比時,請將除法中的至少一個整數值,轉換為 雙任務 () 或遞減 () 。 這可確保不會因為整數除法而截斷結果。 如需詳細資訊,請參閱 算術運算的類型規則

根據數據表大小計算百分比

若要依事件類型比較 storm 數目與資料庫中的 Storm 總數,請先將資料庫中的 storm 總數儲存為變數。 Let 語句 可用來定義查詢內的變數。

由於 表格式表達式語句 會傳回表格式結果,因此請使用 toscalar () 函數,將函式的 count() 表格式結果轉換為純量值。 然後,數值可用於百分比計算。

let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0

輸出

EventType EventCount 百分比
Thunderstorm Wind 13015 22.034673077574237
Hail 12711 21.519994582331627
Flash Flood 3688 6.2438627975485055
乾旱 3616 6.1219652592015716
冬季天氣 3349 5.669928554498358
... ... ...

擷取唯一值

使用 make_set () ,將數據表中的數據列選取範圍轉換成唯一值的陣列。

下列查詢會使用 make_set() 來建立事件類型的數位,以在每個州造成死結。 然後,產生的數據表會依每個數位中的 Storm 類型數目排序。

StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)

輸出

State StormTypesWithDeaths
加利福尼亞州 [“Weatherstorm Wind”,“High Surf”,“Cold/Wind Chill”,“Strong Wind”,“Rip Current”,“Heat”,“超熱”,“Wildfire”,“垃圾雨”,“氣象低波”,“密集氣象”]
德克薩斯州 [“Flash Flood”,“Dragonstorm Wind”,“Tornado”,“Lightning”,“Storm”,“Weather Weather”,“Rip Current”,“超熱”,“密集熱”,“高密度 (Typhoon) ”,“冷/風冷”]
奧克拉何馬州 [“Flash Flood”,“Tornado”,“冷/風冷卻”,“冷/風冷”,“冷雪”,“大雪”,“超熱”,“熱”,“冰雨”,“冷天氣”,“密集光”]
紐約 [“Flood”,“Storm”,“Lightningstorm Wind”,“Flash Flood”,“Weather Weather”,“Ice Storm”,“極端冷/風冷”,“雪雨”,“大雪”]
堪薩斯州 [“Heavystorm Wind”,“Heavy Rain”,“Tornado”,“Flood”,“Flash Flood”,“Lightning”,“Heavy Snow”,“Weather Weather”,“Blizzard”]
... ...

依條件分組的數據區數據

案例 () 函式會根據指定的條件將數據分組到貯體。 函式會傳回第一個滿足述詞的對應結果表達式,如果沒有滿足任何述詞,則傳回最後一個表達式。

此範例會根據其公民所維持的 Storm 相關事件數目來分組州。

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| sort by State asc

輸出

State 擷取帳戶 擷取者Bucket
ALABAMA 494 大型
阿拉斯加州 0 無痕
美屬薩摩亞 0 無痕
亞利桑那州 6 Small
阿肯色州 54 大型
大西洋北部 15
... ... ...

建立餅圖,以可視化方式呈現遇到暴雨的狀態比例,導致大型、中型或少量的風雲。

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| summarize InjuryBucketByState=count() by InjuriesBucket
| render piechart 

Azure Data Explorer Web UI 餅圖的螢幕快照,此圖表是由上一個查詢呈現。

對滑動視窗執行彙總

下列範例示範如何使用滑動視窗摘要數據行。

此查詢會使用七天的滑動視窗來計算佇風、水雨和通火的最小、最大值和平均屬性損害。 結果集中的每一筆記錄都會彙總過去七天,而結果則會針對分析期間內的每一天包含一筆記錄。

以下是查詢的逐步說明:

  1. 將每筆記錄量化到相對於的單一天 windowStart
  2. 將七天新增至 bin 值,以設定每個記錄的範圍結尾。 如果值超出 和 windowEnd的範圍windowStart,請據以調整值。
  3. 為每個記錄建立七天的陣列,從記錄的目前日期開始。
  4. 使用 mv-expand 從步驟3展開陣列,以便將每筆記錄重複到兩者之間有一天間隔的七筆記錄。
  5. 執行每天的匯總。 由於步驟 4,此步驟實際上摘要說明過去七天。
  6. 從最終結果中排除前七天,因為沒有七天的回溯期間。
let windowStart = datetime(2007-07-01);
let windowEnd = windowStart + 13d;
StormEvents
| where EventType in ("Tornado", "Flood", "Wildfire") 
| extend bin = bin_at(startofday(StartTime), 1d, windowStart) // 1
| extend endRange = iff(bin + 7d > windowEnd, windowEnd, 
                      iff(bin + 7d - 1d < windowStart, windowStart, 
                        iff(bin + 7d - 1d < bin, bin, bin + 7d - 1d))) // 2
| extend range = range(bin, endRange, 1d) // 3
| mv-expand range to typeof(datetime) // 4
| summarize min(DamageProperty), max(DamageProperty), round(avg(DamageProperty)) by Timestamp=bin_at(range, 1d, windowStart), EventType // 5
| where Timestamp >= windowStart + 7d; // 6

輸出

下列結果表已截斷。 若要查看完整的輸出,請執行查詢。

時間戳記 EventType min_DamageProperty max_DamageProperty avg_DamageProperty
2007-07-08T00:00:00Z 龍捲風 0 30000 6905
2007-07-08T00:00:00Z Flood 0 200000 9261
2007-07-08T00:00:00Z 野火 0 200000 14033
2007-07-09T00:00:00Z 龍捲風 0 100000 14783
2007-07-09T00:00:00Z Flood 0 200000 12529
2007-07-09T00:00:00Z 野火 0 200000 14033
2007-07-10T00:00:00Z 龍捲風 0 100000 31400
2007-07-10T00:00:00Z Flood 0 200000 12263
2007-07-10T00:00:00Z 野火 0 200000 11694
... ... ...

後續步驟

既然您已熟悉常見的查詢運算符和匯總函數,請繼續進行下一個教學課程,以瞭解如何聯結來自多個數據表的數據。