共用方式為


教學課程:使用聚合函數

適用於:✅Microsoft網狀架構Azure 數據✅總管 Azure 監視器✅Microsoft Sentinel

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

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

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

本教學課程中的範例會使用StormEvents可在天氣分析範例數據公開使用的數據表。

本教學課程是以第一個 教學課程 Learn 一般運算符為基礎。

必要條件

若要執行下列查詢,您需要具有範例數據的存取權的查詢環境。 您可以使用下列其中一項:

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

使用摘要運算子

summarize 運算符對於對您的數據執行匯總至關重要。 運算子會 summarize 根據 by 子句將數據列分組在一起,然後使用提供的聚合函數結合單一數據列中的每一個群組。

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

StormEvents
| summarize TotalStorms = count() by State

輸出

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

將查詢結果可視化

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

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

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

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

有條件地計算數據列

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

下列查詢會使用 countif() 來計算造成損壞的風暴計數。 然後,查詢會 top 使用 運算符來篩選結果,並顯示由暴風雨造成最高作物損毀的狀態。

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

輸出

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

將數據分組到 bin

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

下列查詢會計算在 2007 年每周造成作物損壞的風暴數目。 自 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 將數據列指派給群組。

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

若要深入瞭解造成作物破壞的暴風雨類型,請計算 每個事件類型的 min()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
洪水 500000000 1000 4844925.23364486
雷暴風 22000000 100 920328.36538461538
... ... ... ...

上一個查詢的結果指出,Frost/Freeze 事件平均導致作物損失最多。 然而, 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 來尋找導致每個狀態作物損壞的暴風雨事件百分比。 首先,計算每個州中的風暴總數。 然後,計算每個州造成作物損壞的風暴數目。

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

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

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

輸出

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

注意

計算百分比時,請將除法中至少有一個整數值與 todouble() 或 toreal() 轉換。 這可確保由於整數除法,您不會得到截斷的結果。 如需詳細資訊,請參閱 算術運算的類型規則。

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

若要依事件類型比較 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 百分比
雷暴風 13015 22.034673077574237
冰雹 12711 21.519994582331627
暴洪 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)

輸出

州/省 StormTypesWithDeaths
加利福尼亞州 [“雷暴風”,“高衝浪”,“冷/風寒”,“強風”,“撕裂電流”,“熱”,“過熱”,“野火”,“塵暴”,“天文低潮”,“濃霧”,“冬季天氣”]
德克薩斯州 [“山洪”、“雷雨風”、“龍捲風”、“閃電”、“洪水”、“冰風暴”、“冬季天氣”、“撕裂電流”、“過大熱”、“濃霧”、“颶風(颱風)”、“冷/風寒”]
奧克拉荷馬州 [“山洪”、“龍捲風”、“冷/風寒”、“冬季風暴”、“大雪”、“過熱”、“冰雨”、“冬季天氣”、“濃霧”]
紐約州 [“洪水”,“閃電”,“雷暴風”,“山洪”,“冬季天氣”,“冰暴”,“極端冷/風寒”,“冬季風暴”,“大雪”]
堪薩斯州 [“雷暴風”、“暴雨”、“龍捲風”、“洪水”、“山洪”、“閃電”、“大雪”、“冬季天氣”、“暴風雪”]
... ...

依條件貯體數據

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

這個範例會根據公民遭受的風暴相關傷害數目來分組。

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

輸出

州/省 InjuriesCount InjuriesBucket
阿拉巴馬州 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 

上一個查詢所呈現 Web UI 餅圖的螢幕快照。

在滑動視窗上執行匯總

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

此查詢會使用七天的滑動視窗,計算龍捲風、洪水和野火的最小、最大值和平均財產損失。 結果集中的每個記錄都會匯總前七天,而結果會在分析期間包含每天的記錄。

以下是查詢的逐步說明:

  1. 將每筆記錄量化為相對於的單一天 windowStart
  2. 將七天新增至 bin 值,以設定每個記錄的範圍結尾。 如果值超出 和 windowEnd的範圍windowStart,請據以調整值。
  3. 從記錄的目前日期開始,為每個記錄建立七天的陣列。
  4. 使用mv-expand 從步驟 3 展開陣列,以便將每筆記錄複製到 7 筆記錄,並在兩者之間有一天的間隔。
  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 洪水 0 200000 9261
2007-07-08T00:00:00Z 野火 0 200000 14033
2007-07-09T00:00:00Z 龍捲風 0 100000 14783
2007-07-09T00:00:00Z 洪水 0 200000 12529
2007-07-09T00:00:00Z 野火 0 200000 14033
2007-07-10T00:00:00Z 龍捲風 0 100000 31400
2007-07-10T00:00:00Z 洪水 0 200000 12,263
2007-07-10T00:00:00Z 野火 0 200000 11694
... ... ...

後續步驟

現在您已熟悉常見的查詢運算符和聚合函數,請繼續進行下一個教學課程,以瞭解如何從多個數據表聯結數據。