教學課程:使用聚合函數

使用 版本 下拉選單切換服務。 了解更多關於導航的資訊。
適用於:✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure 監視器 ✅ Microsoft Sentinel

聚合函數 將多列資料分組並合併成摘要值。 摘要值取決於所選函數,例如計數、最大值或平均值。

在這個教學中,你會學到如何:

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

本教學課程中的範例使用 StormEvents 資料表,該資料表可在 天氣分析範例資料中公開取得。

本教學課程是以第一個教學課程 了解常見運算子為基礎。

必要條件

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

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

使用摘要運算子

摘要運算子對於對你的資料進行聚合非常重要。 運算子 summarize 根據子 by 句將列分組,然後利用提供的聚合函數將每個群組合併為一列。

使用 summarize 搭配 count 彙總函數,依州別找出事件數量。

StormEvents
| summarize TotalStorms = count() by State

輸出

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

將查詢結果可視化

在圖表或圖表中可視化查詢結果可協助您識別數據中的模式、趨勢和極端值。 你可以使用 渲染 運算子來建立這些視覺化。

在整個教學過程中,你會看到如何用 render 來展示結果的範例。 部分可用的圖表類型包括長條圖、折線圖、圓餅圖和散點圖。 目前請用 render 條狀圖查看前一次查詢的結果。

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

使用渲染運算子建立的螢幕擷取顯示州別風暴總數的長條圖。

有條件地計算數據列

分析資料時,請使用 countif() 根據特定條件計算列數。 此功能幫助你了解有多少列符合指定條件。

以下查詢用於 countif() 計算造成損害的風暴數量。 查詢接著使用 top 運算子來篩選結果,並顯示因暴風雨造成作物損害最嚴重的各州。

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

輸出

州 導致農作物受損的風暴
愛荷華州 359
內布拉斯加州 201
密西西比州 105
北卡羅來那州 82
密蘇里州 78

將資料分箱

若要依數字或時間值彙整資料,首先使用 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)

輸出

開始時間 事件計數
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 將數據列指派給群組。

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

想了解更多會造成作物損害的風暴類型,請計算每種事件類型的 最小()、 最大()和 平均 作物損害。 然後,依照平均傷害排序結果。

你可以在單一 summarize 運算元中使用多個聚合函數,產生多個計算出的欄位。

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

輸出

事件類型 MaxCropDamage MinCropDamage 平均作物損害
結霜/凍結 568600000 3000 9106087.5954198465
野火 21000000 10000 7268333.333333333
乾旱 700000000 2000 6763977.8761061952
洪水 500000000 1000 4844925.23364486
雷暴風 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 來尋找導致每個狀態作物損壞的暴風雨事件百分比。 首先,計算每個州中的風暴總數。 然後,計算每個州造成作物損壞的風暴數目。

然後,使用 extend 計算兩個資料行之間的百分比,方法是將造成農作物損害的暴風雨數量除以暴風雨總數,再乘以 100。

若要確保您得到小數結果,請先使用 todouble() 函式,將整數計數值中的至少一個轉換為 double 類型,再執行除法。

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

輸出

州 州內風暴總數 導致農作物受損的風暴 作物受損百分比
愛荷華州 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

輸出

事件類型 事件計數 百分比
雷暴風 13015 22.034673077574237
冰雹 12711 21.519994582331627
暴洪 3688 6.2438627975485055
乾旱 3616 6.1219652592015716
冬季天氣 3349 5.669928554498358
... ... ...

擷取唯一值

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

下列查詢會使用 make_set() 建立一個陣列,包含在各州造成死亡的事件類型。 產生的資料表接著會依照每個陣列中的風暴類型數量排序。

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

輸出

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

依條件貯體數據

case() 函式會根據指定的條件將資料分組到不同區間。 函式會針對第一個獲得滿足的述詞,傳回其對應的結果運算式;如果沒有任何述詞獲得滿足,則傳回最後的 else 運算式。

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

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

輸出

州 受傷人數 InjuriesBucket
阿拉巴馬州 494 大型
阿拉斯加州 0 沒有受傷
美屬薩摩亞 0 沒有受傷
亞利桑那州 6 小
阿肯色州 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 用戶介面的圓餅圖螢幕擷取畫面。

在滑動視窗上執行匯總

以下範例展示了如何使用滑動視窗來彙整欄位。

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

以下是查詢的逐步說明:

  1. 將每筆記錄量化為相對於的單一天 windowStart。
  2. 將 bin 值加上七天,以設定每筆記錄的範圍結束值。 如果該值超出 windowStart 和 windowEnd 的範圍,請相應調整該值。
  3. 從記錄的目前日期開始,為每個記錄建立七天的陣列。
  4. 使用 mv-expand 展開步驟 3 的陣列,將每筆記錄複製成七筆,且這七筆記錄彼此之間間隔一天。
  5. 執行每天的匯總。 因為第四步,這步驟實際上是過去七天的總結。
  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

輸出

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

時間戳記 事件類型 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
... ... ...

後續步驟

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