Kurz: Použití agregačních funkcí
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, maximu 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 zkoumat data s vlastními daty, vytvořte si vlastní bezplatný cluster.
Tento kurz je založen na základech z prvního kurzu , Naučte se běžné operátory.
Požadavky
- Účet Microsoft nebo Microsoft Entra identitu uživatele pro přihlášení ke clusteru nápovědy
Použití operátoru sumarizace
Operátor summarize je nezbytný k provádění agregací dat. Operátor summarize
seskupuje řádky na by
základě klauzule a pak pomocí poskytnuté agregační funkce zkombinuje každou skupinu do jednoho řádku.
Počet událostí zjistíte podle stavu pomocí summarize
agregační funkce počtu .
StormEvents
| summarize TotalStorms = count() by State
Výstup
Stav | TotalStorms |
---|---|
TEXAS | 4701 |
KANSAS | 3166 |
IOWA | 2337 |
ILLINOIS | 2022 |
MISSOURI | 2016 |
... | ... |
Vizualizace výsledků dotazu
Vizualizace výsledků dotazu v grafu vám může pomoct identifikovat vzory, trendy a odlehlé hodnoty v datech. Můžete to provést pomocí operátoru render .
V tomto kurzu uvidíte příklady render
použití k zobrazení výsledků. Prozatím použijeme render
k zobrazení výsledků 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 použijte countif() k počítání řádků na základě konkrétní podmínky, abyste pochopili, kolik řádků splňuje daná kritéria.
Následující dotaz používá countif()
k číslu bouřek, které způsobily škodu. Dotaz pak pomocí operátoru top
vyfiltruje výsledky a zobrazí stavy s nejvyšším poškozením plodin způsobeným bouřemi.
StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage
Výstup
Stav | StormsWithCropDamage |
---|---|
IOWA | 359 |
NEBRASKA | 201 |
MISSISSIPPI | 105 |
SEVERNÍ KAROLÍNA | 82 |
MISSOURI | 78 |
Seskupení dat do přihrádek
Pokud chcete data agregovat podle číselných nebo časových hodnot, budete je nejdřív chtít seskupit do přihrádek pomocí funkce bin(). Použití bin()
vám pomůže pochopit, jak jsou hodnoty distribuovány v určitém rozsahu, a porovnávat různá období.
Následující dotaz spočítá počet bouří, 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
StartTime | Počet událostí |
---|---|
2007-01-01T0:00:00Z | 16 |
2007-01-08T0:00:00Z | 20 |
2007-01-29T00:00:00Z | 8 |
2007-02-05T00:00:00Z | 1 |
2007-02-12T00:00:00Z | 3 |
... | ... |
Přidáním | render timechart
na konec dotazu vizualizujete výsledky.
Poznámka
bin()
je podobná funkci v floor()
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 do skupin.
Výpočet minima, maxima, prům. a součtu
Pokud chcete získat další informace o typech bouří, které způsobují poškození plodin, vypočítejte min(), max() a avg() poškození plodin pro každý typ události a potom seřaďte výsledek podle průměrného poškození.
Všimněte si, že v jednom summarize
operátoru můžete použít více agregačních funkcí a vytvořit několik počítaných sloupců.
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/zamrznutí | 568600000 | 3000 | 9106087.5954198465 |
Wildfire | 21000000 | 10000 | 7268333.333333333 |
Sucha | 700000000 | 2000 | 6763977.8761061952 |
Povodní | 500000000 | 1000 | 4844925.23364486 |
Bouřkový vítr | 22000000 | 100 | 920328.36538461538 |
... | ... | ... | ... |
Výsledky předchozího dotazu ukazují, že události typu mráz/zmrazení způsobily v průměru nejvíce poškození plodin. Dotaz bin() však ukázal, že k událostem s poškozením plodin většinou došlo 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 nějaké škody, jako tomu bylo 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ž bylo pravděpodobně způsobeno mrazem / mrazem.
Tip
K provádění podmíněných agregací použijte minif(),maxif(), avgif() a sumif(), jako jsme to udělali v oddílu podmíněného počítání řádků .
Výpočet procent
Výpočet procent vám může pomoct pochopit rozdělení a podíl různých hodnot v datech. Tato část popisuje dvě běžné metody výpočtu procent pomocí dotazovací jazyk Kusto (KQL).
Výpočet procenta na základě dvou sloupců
Pomocí funkcí count() a countif můžete zjistit procento bouřek, které způsobily poškození plodin v jednotlivých stavech. Nejprve spočítejte celkový počet bouřek v každém státě. Pak spočítejte počet bouřek, které způsobily škody na plodinách v jednotlivých státech.
Potom pomocí rozšíření vypočítáte procento mezi dvěma sloupci tak, že vydělíte počet bouřek s poškozením plodin celkovým počtem bouřek a vynásobíte číslem 100.
Abyste měli jistotu, že dostanete desetinný výsledek, před dělením převeďte pomocí funkce todouble() alespoň jednu hodnotu celočíselného počtu na hodnotu double.
StormEvents
| summarize
TotalStormsInState = count(),
StormsWithCropDamage = countif(DamageCrops > 0)
by State
| extend PercentWithCropDamage =
round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage
Výstup
Stav | TotalStormsInState | StormsWithCropDamage | PercentWithCropDamage |
---|---|---|---|
IOWA | 2337 | 359 | 15.36 |
NEBRASKA | 1766 | 201 | 11.38 |
MISSISSIPPI | 1218 | 105 | 8.62 |
SEVERNÍ KAROLÍNA | 1721 | 82 | 4.76 |
MISSOURI | 2016 | 78 | 3.87 |
... | ... | ... | ... |
Poznámka
Při výpočtu procent převeďte alespoň jednu celočíselnou hodnotu v dělení na hodnotu todouble() nebo toreal(). Tím zajistíte, že se vám kvůli celočíselnému dělení nezobrazí zkrácené výsledky. 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 bouřek v databázi, uložte nejprve celkový počet bouřek v databázi jako proměnnou. Příkazy Let se používají k definování proměnných v rámci 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 procentuální hodnoty.
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 | Počet událostí | Procento |
---|---|---|
Bouřkový vítr | 13015 | 22.034673077574237 |
Krupobití | 12711 | 21.519994582331627 |
Blesková povodeň | 3688 | 6.2438627975485055 |
Sucha | 3616 | 6.1219652592015716 |
Zimní počasí | 3349 | 5.669928554498358 |
... | ... | ... |
Extrahování jedinečných hodnot
Pomocí make_set() můžete výběr řádků v tabulce převést na pole 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 státech. Výsledná tabulka se pak seřadí podle počtu typů storm v každém poli.
StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)
Výstup
Stav | StormTypesWithDeaths |
---|---|
KALIFORNIE | ["Vítr v bouřce","Vysoký příboj","Studená/větrná zima","Silný vítr","Proud","Teplo","Nadměrné teplo","Požár","Prachová bouře","Astronomický odliv","Hustá mlha","Zimní počasí"] |
TEXAS | ["Blesková povodeň","Bouřkový vítr","Tornado","Blesk","Povodeň","Ledová bouře","Zimní počasí","Rip Current","Nadměrné teplo","Hustá mlha","Hurikán (tajfun)","Studená/větrná pohoda"] |
OKLAHOMA | ["Blesková povodeň","Tornado","Chlad/vítr","Zimní bouře","Těžký sníh","Nadměrné teplo","Teplo","Ledová bouře","Zimní počasí","Hustá mlha"] |
NEW YORK | ["Povodeň","Blesk","Bouřkový vítr","Blesková povodeň","Zimní počasí","Ledová bouře","Extrémní chlad/vítr","Zimní bouře","Těžký sníh"] |
KANSAS | ["Bouřkový vítr","Silný déšť","Tornádo","Povodeň","Blesk","Blesk","Těžký sníh","Zimní počasí","Blizzard"] |
... | ... |
Rozdělení dat podle podmínky
Funkce case() seskupuje data do kontejnerů na základě zadaných podmínek. Funkce vrátí odpovídající výsledný výraz 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ří, 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
Stav | Počet zranění | ZraněníBucket |
---|---|---|
ALABAMA | 494 | Velká |
ALJAŠKA | 0 | Bez zranění |
AMERICKÁ SAMOA | 0 | Bez zranění |
ARIZONA | 6 | Malá |
ARKANSAS | 54 | Velká |
SEVERNÍ ATLANTIK | 15 | Střední |
... | ... | ... |
Vytvořte výsečový graf, který vizualizuje podíl států, u které došlo k bouřím, jejichž výsledkem byl velký, střední nebo malý počet 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é škody na majetku tornád, povodní a požárů pomocí posuvného okna sedmi dnů. Každý záznam v sadě výsledků agreguje předchozích sedm dnů a výsledky obsahují záznam za den v analyzovaném období.
Tady je podrobné vysvětlení dotazu:
- Interval každého záznamu na jeden den vzhledem k
windowStart
. - Přidáním sedmi dnů do hodnoty intervalu nastavíte konec rozsahu pro každý záznam. Pokud je hodnota mimo rozsah
windowStart
awindowEnd
, upravte hodnotu odpovídajícím způsobem. - Vytvořte pole sedmi dnů pro každý záznam počínaje aktuálním dnem záznamu.
- Rozbalte pole z kroku 3 pomocí funkce 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ích sedm dnů.
- Z konečného výsledku vyloučíte prvních sedm dní, protože pro ně neexistuje žádné sedmidenní období zpětné analýzy.
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.
Timestamp | Typ události | min_DamageProperty | max_DamageProperty | avg_DamageProperty |
---|---|---|---|---|
2007-07-08T0:00:00Z | Tornádo | 0 | 30000 | 6905 |
2007-07-08T0:00:00Z | Povodní | 0 | 200000 | 9261 |
2007-07-08T0:00:00Z | Wildfire | 0 | 200000 | 14033 |
2007-07-09T0:00:00Z | Tornádo | 0 | 100000 | 14783 |
2007-07-09T0:00:00Z | Povodní | 0 | 200000 | 12529 |
2007-07-09T0:00:00Z | Wildfire | 0 | 200000 | 14033 |
2007-07-10T00:00:00Z | Tornádo | 0 | 100000 | 31400 |
2007-07-10T00:00:00Z | Povodní | 0 | 200000 | 12263 |
2007-07-10T00:00:00Z | Wildfire | 0 | 200000 | 11694 |
... | ... | ... |
Další krok
Teď, když jste obeznámeni s běžnými operátory dotazů a agregačními funkcemi, přejděte k dalšímu kurzu, ve kterém se dozvíte, jak spojit data z více tabulek.
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro