Kurz: Použití agregačních funkcí
Platí pro: ✅Microsoft Fabric✅Azure Data Explorer✅Azure Monitor✅Microsoft Sentinel
Agregační funkce umožňují seskupovat a kombinovat data z více řádků do souhrnné hodnoty. Souhrnná hodnota závisí na zvolené funkci, například na počtu, maximální nebo průměrné hodnotě.
V tomto kurzu se naučíte:
Příklady v tomto kurzu používají StormEvents
tabulku, která je veřejně dostupná v clusteru nápovědy. Pokud chcete prozkoumat vlastní data, vytvořte si vlastní bezplatný cluster.
Příklady v tomto kurzu používají StormEvents
tabulku, která je veřejně dostupná v ukázkových datech analýzy počasí.
Tento kurz vychází ze základů z prvního kurzu, běžných operátorů Learn.
Požadavky
Pokud chcete spustit následující dotazy, potřebujete prostředí dotazu s přístupem k ukázkovým datům. Můžete použít jednu z těchto možností:
- Účet Microsoft nebo identita uživatele Microsoft Entra
- Pracovní prostor Fabric s kapacitou s povolenou kapacitou Microsoft Fabric
Použití operátoru summarize
Operátor sumarizace je nezbytný k provádění agregací nad daty. Operátor summarize
seskupí řádky podle by
klauzule a pak použije zadanou agregační funkci ke kombinování každé skupiny v jednom řádku.
Pomocí funkce agregace počtu zjistíte počet událostí podle stavu.summarize
StormEvents
| summarize TotalStorms = count() by State
Výstup
State | TotalStorms |
---|---|
TEXAS | 4701 |
KANSAS | 3166 |
IOWA | 2337 |
ILLINOIS | 2022 |
MISSOURI | 2016 |
... | ... |
Vizualizace výsledků dotazu
Vizualizace výsledků dotazu v grafu nebo grafu vám může pomoct identifikovat vzory, trendy a odlehlé hodnoty v datech. Můžete to provést pomocí operátoru vykreslování .
V průběhu kurzu uvidíte příklady render
použití k zobrazení výsledků. Prozatím se pojďme render
podívat na výsledky z předchozího dotazu v pruhovém grafu.
StormEvents
| summarize TotalStorms = count() by State
| render barchart
Podmíněný počet řádků
Při analýze dat můžete pomocí funkce countif() spočítat řádky na základě konkrétní podmínky, abyste pochopili, kolik řádků splňuje daná kritéria.
Následující dotaz používá countif()
počet bouřek, které způsobily poškození. Dotaz pak pomocí operátoru top
vyfiltruje výsledky a zobrazí stavy s nejvyšším množstvím poškození oříznutí způsobeným bouřemi.
StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage
Výstup
State | StormsWithCropDamage |
---|---|
IOWA | 359 |
NEBRASKA | 201 |
MISSISSIPPI | 105 |
NORTH CAROLINA | 82 |
MISSOURI | 78 |
Seskupení dat do přihrádek
Pokud chcete data agregovat podle číselných nebo časových hodnot, nejprve budete chtít data seskupit do intervalů pomocí funkce bin(). Použití bin()
vám pomůže pochopit, jak se hodnoty distribuují v určitém rozsahu, a porovnávání mezi různými obdobími.
Následující dotaz spočítá počet bouřek, které způsobily poškození plodin za každý týden v roce 2007. Argument 7d
představuje týden, protože funkce vyžaduje platnou hodnotu časového rozsahu .
StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31))
and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)
Výstup
Počáteční čas | EventCount |
---|---|
2007-01-01T00:00:00Z | 16 |
2007-01-08T00:00:00Z | 20 |
2007-01-29T00:00:00Z | 8 |
2007-02-05T00:00:00Z | 0 |
2007-02-12T00:00:00Z | 3 |
... | ... |
Pokud chcete vizualizovat výsledky, přidejte | render timechart
na konec dotazu.
Poznámka:
bin()
je podobná floor()
funkci v jiných programovacích jazycích. Snižuje každou hodnotu na nejbližší násobek modulu, který zadáte, a umožňuje summarize
přiřadit řádky ke skupinám.
Výpočet minimálního, maximálního, průměrného a součtu
Další informace o typech bouřek, které způsobují poškození oříznutí, vypočítejte pro každý typ události min(), max() a avg() a pak výsledek seřaďte podle průměrného poškození.
Všimněte si, že k vytvoření několika počítaných sloupců můžete použít více agregačních funkcí v jednom summarize
operátoru.
StormEvents
| where DamageCrops > 0
| summarize
MaxCropDamage=max(DamageCrops),
MinCropDamage=min(DamageCrops),
AvgCropDamage=avg(DamageCrops)
by EventType
| sort by AvgCropDamage
Výstup
Typ události | MaxCropDamage | MinCropDamage | AvgCropDamage |
---|---|---|---|
Mráz/Ukotvení | 568600000 | 3000 | 9106087.5954198465 |
Ničivý požár | 21000000 | 10000 | 7268333.333333333 |
Sucho | 700000000 | 2000 | 6763977.8761061952 |
Povodeň | 500000000 | 1000 | 4844925.23364486 |
Větrná bouře | 22000000 | 100 | 920328.36538461538 |
... | ... | ... | ... |
Výsledky předchozího dotazu naznačují, že události Frost/Freeze způsobily v průměru největší poškození oříznutí. Dotaz bin() však ukázal, že události s poškozením oříznutí se většinou uskutečnily v letních měsících.
Pomocí funkce sum() zkontrolujte celkový počet poškozených plodin místo množství událostí, které způsobily určité škody, jak je to provedeno count()
v předchozím dotazu bin().
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
Nyní můžete vidět špičku v poškození plodin v lednu, což pravděpodobně bylo způsobeno Mrazem/Ukotvením.
Tip
Pomocí minif(), maxif(), avgif() a sumif() můžete provádět podmíněné agregace, jako jsme to udělali v oddílu s podmíněným počtem řádků .
Výpočet procentuálních hodnot
Výpočet procent vám může pomoct pochopit rozdělení a poměr různých hodnot v datech. Tato část se zabývá dvěma běžnými metodami výpočtu procent pomocí dotazovací jazyk Kusto (KQL).
Výpočet procenta na základě dvou sloupců
Pomocí funkce count() a countif vyhledejte procento událostí bouře, které způsobily poškození plodin v jednotlivých stavech. Nejprve spočítejte celkový počet bouřek v jednotlivých stavech. Pak spočítejte počet bouřek, které způsobily poškození plodin v jednotlivých stavech.
Pak můžete pomocí rozšíření vypočítat procento mezi těmito dvěma sloupci tak, že vydělíte počet bouří s poškozením oříznutí celkovým počtem bouřek a vynásobíte 100.
Abyste měli jistotu, že získáte desetinný výsledek, před provedením dělení pomocí funkce todouble() převeďte alespoň jednu z celočíselné hodnoty na dvojitou hodnotu.
StormEvents
| summarize
TotalStormsInState = count(),
StormsWithCropDamage = countif(DamageCrops > 0)
by State
| extend PercentWithCropDamage =
round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage
Výstup
State | TotalStormsInState | StormsWithCropDamage | PercentWithCropDamage |
---|---|---|---|
IOWA | 2337 | 359 | 15.36 |
NEBRASKA | 1766 | 201 | 11.38 |
MISSISSIPPI | 1218 | 105 | 8.62 |
NORTH CAROLINA | 1721 | 82 | 4.76 |
MISSOURI | 2016 | 78 | 3.87 |
... | ... | ... | ... |
Poznámka:
Při výpočtu procentuálních hodnot převeďte alespoň jednu z celočíselné hodnoty v dělení na todouble() nebo toreal().> Tím zajistíte, že nezkrátíte výsledky z důvodu celočíselného dělení. Další informace najdete v tématu Pravidla typů pro aritmetické operace.
Výpočet procenta na základě velikosti tabulky
Pokud chcete porovnat počet stormů podle typu události s celkovým počtem stormů v databázi, nejprve uložte celkový počet stormů v databázi jako proměnnou. Příkazy Let se používají k definování proměnných v dotazu.
Vzhledem k tomu, že příkazy tabulkových výrazů vracejí tabulkové výsledky, použijte funkci toscalar() k převodu tabulkového výsledku count()
funkce na skalární hodnotu. Číselnou hodnotu pak můžete použít při výpočtu procenta.
let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0
Výstup
Typ události | EventCount | Procento |
---|---|---|
Větrná bouře | 13015 | 22.034673077574237 |
Krupobití | 12711 | 21.519994582331627 |
Velká voda | 3688 | 6.2438627975485055 |
Sucho | 3616 | 6.1219652592015716 |
Počasí v zimě | 3349 | 5.669928554498358 |
... | ... | ... |
Extrahování jedinečných hodnot
Pomocí make_set() můžete převést výběr řádků v tabulce na matici jedinečných hodnot.
Následující dotaz používá make_set()
k vytvoření pole typů událostí, které způsobují úmrtí v jednotlivých stavech. Výsledná tabulka se pak seřadí podle počtu typů storm v jednotlivých polích.
StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)
Výstup
State | StormTypesWithDeaths |
---|---|
KALIFORNIE | ["Bouře větru","Vysoký surf","Studená/Větrná zimnice","Silný vítr","Roztržení proudu","Teplo","Nadměrné teplo","Požár","Bouře prachu","Astronomický nízký příliv","Hustá mlha","Zimní počasí"] |
TEXAS | ["Blesková záplava","Bouře větru","Tornado","Blesk","Záplava","Ledová bouře","Zimní počasí","Roztržení proudu","Nadměrné teplo","Hustá mlha","Hurikán (Typhoon)","Studená/Větrná zimnice"] |
OKLAHOMA | ["Blesková záplava","Tornado","Studená/Větrná zimnice","Zimní bouře","Těžký sníh","Nadměrné teplo","Teplo","Ledová bouře","Zimní počasí","Hustá mlha"] |
NEW YORK | ["Povodeň","Blesk","Bouře větru","Blesková záplava","Zimní počasí","Ledová bouře","Extrémní studená/větrná zimnice","Zimní bouře","Těžký sníh"] |
KANSAS | ["Bouře větru","Těžký déšť","Tornado","Záplava","Blesk","Blesk","Těžký sníh","Zimní počasí","Blizzard"] |
... | ... |
Kontejnerová data podle podmínky
Funkce case() seskupuje data do kontejnerů na základě zadaných podmínek. Funkce vrátí odpovídající výsledek výrazu pro první splněný predikát nebo konečný výraz else, pokud není splněn žádný z predikátů.
Tento příklad seskupuje státy na základě počtu zranění souvisejících s bouřemi, které jejich občané utrpěli.
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
Výstup
State | Počet zranění | ZraněníBucket |
---|---|---|
ALABAMA | 494 | Velká |
ALJAŠKA | 0 | Žádné zranění |
AMERICKÁ SAMOA | 0 | Žádné zranění |
ARIZONA | 6 | Malá |
ARKANSAS | 54 | Velká |
ATLANTIC NORTH | 15 | Střední |
... | ... | ... |
Vytvořte výsečový graf, který vizualizuje podíl stavů, které zaznamenaly bouře, což vede k velkému, střednímu nebo malému počtu zranění.
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
Provádění agregací přes posuvné okno
Následující příklad ukazuje, jak shrnout sloupce pomocí posuvného okna.
Dotaz vypočítá minimální, maximální a průměrné poškození majetku tornád, povodní a požárů pomocí posuvného okna sedmi dnů. Každý záznam v sadě výsledků agreguje předchozí sedm dnů a výsledky obsahují záznam za den v analytickém období.
Tady je podrobné vysvětlení dotazu:
- Přihrádejte každý záznam na jeden den vzhledem k
windowStart
. - Přidejte sedm dnů do hodnoty přihrádky a nastavte konec rozsahu pro každý záznam. Pokud je hodnota mimo rozsah
windowStart
awindowEnd
, upravte hodnotu odpovídajícím způsobem. - Vytvořte pro každý záznam pole se sedmi dny počínaje aktuálním dnem záznamu.
- Rozbalte pole z kroku 3 pomocí mv-expand , aby se každý záznam duplikoval na sedm záznamů s intervaly jednoho dne mezi nimi.
- Proveďte agregace pro každý den. Vzhledem ke kroku 4 tento krok ve skutečnosti shrnuje předchozí sedm dnů.
- Vyloučí prvních sedm dnů z konečného výsledku, protože pro ně neexistuje sedmidenní období zpětného vyhledávání.
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
Výstup
Následující tabulka výsledků je zkrácena. Pokud chcete zobrazit úplný výstup, spusťte dotaz.
Časové razítko | Typ události | min_DamageProperty | max_DamageProperty | avg_DamageProperty |
---|---|---|---|---|
2007-07-08T00:00:00Z | Tornádo | 0 | 30000 | 6905 |
2007-07-08T00:00:00Z | Povodeň | 0 | 200000 | 9261 |
2007-07-08T00:00:00Z | Ničivý požár | 0 | 200000 | 14033 |
2007-07-09T00:00:00Z | Tornádo | 0 | 100000 | 14783 |
2007-07-09T00:00:00Z | Povodeň | 0 | 200000 | 12529 |
2007-07-09T00:00:00Z | Ničivý požár | 0 | 200000 | 14033 |
2007-07-10T00:00:00Z | Tornádo | 0 | 100000 | 31400 |
2007-07-10T00:00:00Z | Povodeň | 0 | 200000 | 12263 |
2007-07-10T00:00:00Z | Ničivý požár | 0 | 200000 | 11694 |
... | ... | ... |
Další krok
Teď, když znáte běžné operátory dotazů a agregační funkce, přejděte k dalšímu kurzu, kde se dozvíte, jak spojit data z více tabulek.