Sdílet prostřednictvím


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

Snímek obrazovky s pruhovým grafem celkového počtu storms by state vytvořeným pomocí operátoru render

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.

Snímek obrazovky s časovým grafem poškození oříznutí podle týdne vykresleným předchozím dotazem

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

Snímek obrazovky s časovým grafem znázorňujícím poškození oříznutí podle týdne

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 

Snímek obrazovky azure Data Explorer výsečového grafu webového uživatelského rozhraní vykresleného předchozím dotazem

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:

  1. Interval každého záznamu na jeden den vzhledem k windowStart.
  2. Přidáním sedmi dnů do hodnoty intervalu nastavíte konec rozsahu pro každý záznam. Pokud je hodnota mimo rozsah windowStart a windowEnd, upravte hodnotu odpovídajícím způsobem.
  3. Vytvořte pole sedmi dnů pro každý záznam počínaje aktuálním dnem záznamu.
  4. 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.
  5. Proveďte agregace pro každý den. Vzhledem ke kroku 4 tento krok ve skutečnosti shrnuje předchozích sedm dnů.
  6. 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.