教學課程:使用聚合函數
聚合函數 可讓您將數據從多個數據列分組並合併成摘要值。 摘要值取決於所選的函式,例如計數、最大值或平均值。
在本教學課程中,您將了解如何:
本教學課程中的範例會 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
有條件地計算數據列
分析數據時,請使用 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
對滑動視窗執行彙總
下列範例示範如何使用滑動視窗摘要數據行。
此查詢會使用七天的滑動視窗來計算佇風、水雨和通火的最小、最大值和平均屬性損害。 結果集中的每一筆記錄都會彙總過去七天,而結果則會針對分析期間內的每一天包含一筆記錄。
以下是查詢的逐步說明:
- 將每筆記錄量化到相對於的單一天
windowStart
。 - 將七天新增至 bin 值,以設定每個記錄的範圍結尾。 如果值超出 和
windowEnd
的範圍windowStart
,請據以調整值。 - 為每個記錄建立七天的陣列,從記錄的目前日期開始。
- 使用 mv-expand 從步驟3展開陣列,以便將每筆記錄重複到兩者之間有一天間隔的七筆記錄。
- 執行每天的匯總。 由於步驟 4,此步驟實際上摘要說明過去七天。
- 從最終結果中排除前七天,因為沒有七天的回溯期間。
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 |
... | ... | ... |
後續步驟
既然您已熟悉常見的查詢運算符和匯總函數,請繼續進行下一個教學課程,以瞭解如何聯結來自多個數據表的數據。
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應