Sdílet prostřednictvím


Kurz: Použití agregačních funkcí

Platí pro: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft 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 pro přihlášení ke clusteru nápovědy

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

Snímek obrazovky s celkovými bouřemi podle stavového pruhového grafu vytvořeného pomocí operátoru vykreslování

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.

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

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

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

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
... ... ... ...

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 

Snímek obrazovky 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é 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:

  1. Přihrádejte každý záznam na jeden den vzhledem k windowStart.
  2. Přidejte sedm dnů do hodnoty přihrádky a nastavte 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 pro každý záznam pole se sedmi dny počínaje aktuálním dnem záznamu.
  4. 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.
  5. Proveďte agregace pro každý den. Vzhledem ke kroku 4 tento krok ve skutečnosti shrnuje předchozí sedm dnů.
  6. 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.