使用 版本 下拉選單切換服務。 了解更多關於導航的資訊。
適用於:✅ Microsoft Fabric ✅ Azure Data Explorer ✅ Azure 監視器 ✅ Microsoft Sentinel
聚合函數 將多列資料分組並合併成摘要值。 摘要值取決於所選函數,例如計數、最大值或平均值。
在這個教學中,你會學到如何:
本教學課程中的範例使用 StormEvents 資料表,該資料表可在 help 叢集中公開提供。 若要使用您自己的數據進行探索, 請建立您自己的免費叢集。
本教學課程中的範例使用 StormEvents 資料表,該資料表可在 天氣分析範例資料中公開取得。
本教學課程是以第一個教學課程 了解常見運算子為基礎。
必要條件
若要執行下列查詢,您需要具有範例數據的存取權的查詢環境。 使用下列其中一個選項:
- 可登入 說明叢集 的 Microsoft 帳戶或 Microsoft Entra 使用者身分識別
- Microsoft帳戶或Microsoft Entra 使用者身分識別
- 具有已啟用 Microsoft Fabric 的容量的Microsoft Fabric 工作區
使用摘要運算子
摘要運算子對於對你的資料進行聚合非常重要。 運算子 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月份的作物破壞高峰,這可能是由於霜凍/凍結。
計算百分比
計算百分比可協助您了解數據內不同值的分佈和比例。 本節介紹兩種常用的 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
在滑動視窗上執行匯總
以下範例展示了如何使用滑動視窗來彙整欄位。
此查詢透過七天的滑動視窗計算龍捲風、洪水及野火的最小、最大及平均財產損失。 結果集中的每個記錄都會匯總前七天,而結果會在分析期間包含每天的記錄。
以下是查詢的逐步說明:
- 將每筆記錄量化為相對於的單一天
windowStart。 - 將 bin 值加上七天,以設定每筆記錄的範圍結束值。 如果該值超出
windowStart和windowEnd的範圍,請相應調整該值。 - 從記錄的目前日期開始,為每個記錄建立七天的陣列。
- 使用 mv-expand 展開步驟 3 的陣列,將每筆記錄複製成七筆,且這七筆記錄彼此之間間隔一天。
- 執行每天的匯總。 因為第四步,這步驟實際上是過去七天的總結。
- 將前七天排除在最終結果中,因為沒有任何七天的回溯期間。
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 |
| ... | ... | ... |
後續步驟
現在您已熟悉常見的查詢運算符和聚合函數,請繼續進行下一個教學課程,以瞭解如何從多個數據表聯結數據。