DAX funkce TOPN

Úvodní obrázek

Funkce TOPN() je filtrovací iterační funkce vracející tabulku s prvními N řádky podle zadaných argumentů. Funkci TOPN() můžeme používat pro definici počítané tabulky, při psaní DAX dotazů, ale také v měřítku nebo počítaném sloupci.

Funkce TOPN

Funkce TOPN() má následující syntaxi. První tři argumenty jsou povinné, další jsou volitelné.

Syntaxe funkce TOPN:

TOPN
(
    <N_Hodnota>,
    <Tabulka>,
    <Řazení_Výraz>,
    [<Řazení>[, <Řazení_Výraz>, [<Řazení>]]…]
)

Prvním argumentem funkce TOPN() je počet řádků, které se mají vrátit. Jako první argument můžeme použít číslo nebo výraz. Druhým argumentem je tabulka, ze které chceme načíst prvních N řádků. Třetí argument může být výraz vracející skalární hodnotu, například měřítko, nebo odkaz na sloupec v tabulce ve druhém argumentu funkce. Výraz ve druhém argumentu je vyhodnocen v kontextu řádku tabulky uvedené ve druhém argumentu, a podle hodnot třetího argumentu je tato tabulka seřazena a filtrována na prvních N řádků. Ve čtvrtém argumentu pak můžeme volitelně zvolit, zda chceme tabulku seřadit sestupně nebo vzestupně. Pokud čtvrtý argument vynecháme, je výchozí řazení sestupné (DESC). 

Volitelně je možné přidat také další argumenty, díky kterým můžeme ovlivňovat řazení tabulky ve druhém argumentu při vyhledání prvních N řádků. 

Funkce TOPN() může za určitých okolností vracet více řádků, než je zadaný počet v prvním argumentu funkce, jak bude možné vidět v příkladech níže v tomto příspěvku. Výsledná tabulka také nemusí být seřazena tak, jak je uvedeno ve třetím a dalších argumentech funkce. Řazení je důležité pro určení prvních N řádků, ale těchto N řádků pak může být vráceno v různém pořadí.

Příklady TOPN

Příklady uvedené v tomto příspěvku jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix. Soubor s řešením je dostupný ke stažení níže pod tímto článkem. V příkladech budeme často pracovat s měřítkem [Prodeje], které má následující definici.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Začněme jednoduchým příkladem. V použitém cvičném modelu si můžeme vytvořit novou počítanou tabulku, jejímž výsledkem bude sedm nejlepších produktů podle sumy inkasované za jejich prodeje. Takto popsanou tabulku můžeme jednoduše vytvořit právě pomocí funkce TOPN().

Počítaná tabulka:

Top 7 Produktů podle prodejů =
TOPN
(
    7,
    'Product',
    [Prodeje],
    DESC
)

Prvním argumentem funkce TOPN() je počet řádků, které chceme vrátit z tabulky ve druhém argumentu. Tabulka ve druhém argumentu je pak pro výběr prvních sedmi řádků seřazena podle sumy prodejů za každý produkt, od nejvyšší hodnoty pod nejnižší. Výsledná počítaná tabulka může vypadat následovně.

DAX funkce TOPN

Pokud bychom chtěli mít součástí tabulky i hodnotu, podle které je tabulka seřazena, můžeme přidat do tabulky ve druhém argumentu funkce TOPN() sloupec se sumou prodejů, a tento sloupec pak bude součástí výsledné tabulky.

Počítaná tabulka:

Top 7 produktů podle prodejů 2 =
TOPN
(
    7,
    ADDCOLUMNS
    (
        'Product',
        "Prodeje produktu", [Prodeje]
    ),
    [Prodeje produktu],
    DESC
)

Výsledná tabulka obsahuje také hodnoty prodejů. Jak je možné vidět na obrázku níže, tato tabulka není seřazena podle sloupce určeného pro vyhledání prvních N řádků.

DAX funkce TOPN 2

Prvních N řádků můžeme určit  také podle hodnot, které jsou přímo součástí tabulky ve druhém argumentu funkce. Z tabulky 'Product' můžeme například filtrovat prvních 7 produktů s nejvyšší katalogovou cenou, která je ve sloupci 'Product'[List Price].

Počítaná tabulka:

Top 7 Produktů podle katalogové ceny =
TOPN
(
    7,
    'Product',
    'Product'[List Price],
    DESC
)

Jelikož je na sedmém místě v pořadí více produktů se stejnou katalogovou cenou, výsledná tabulka obsahuje více než 7 řádků, jak bylo zadáno v prvním argumentu funkce TOPN().

DAX funkce TOPN 3

Pokud bychom chtěli mít jistotu, že výsledkem bude opravdu maximálně prvních N řádků, musíme použít jednoznačný identifikátor v tabulce. Takovým identifikátorem v tabulce 'Product' je sloupec 'Product'[ProductKey]. Můžeme tedy přidat k předchozí definici počítané tabulky pátý a šestý argument. Tyto dodatečné argumenty budou použity pro řazení v případě duplicitních hodnot na N-tém řádku tabulky.

Počítaná tabulka:

Top 7 Produktů podle katalogové ceny a ID =
TOPN
(
    7,
    'Product',
    'Product'[List Price],
    DESC,
    'Product'[ProductKey],
    ASC
)

Jak můžeme vidět na obrázku níže, nyní již je výsledkem tabulka se sedmi řádky.

DAX funkce TOPN 4

Jak již bylo uvedeno výše, funkci TOPN() můžeme používat mimo jiné také v měřítku. Pokud bychom například chtěli získat sumu za prodané produkty pro 7 nejvíce prodávaných produktů, můžeme použít následující výpočet.

Měřítko:

Prodeje TOP 7 produktů =
CALCULATE
(
    [Prodeje],
    TOPN(7,'Product',[Prodeje])
)

Měřítko [Prodeje TOP 7 produktů] má ve funkci CALCULATE() filtr, který obsahuje tabulku produktů, filtrovanou na 7 produktů s nejvyššími prodeji v aktuálním kontextu vyhodnocení. Pokud vložíme nové měřítko do vizuálu Tabulka, spolu s kategoriemi produktů v řádcích, výsledek může vypadat následovně.

DAX funkce TOPN 5

Jak je vidět na obrázku výše, měřítko [Prodeje TOP 7 produktů] pro každou kategorii nižší hodnotu, než je výsledek měřítka [Prodeje], protože ve filtru měřítka [Prodeje TOP 7 produktů] používáme tabulku obsahující pouze 7 nejprodávanějších produktů dostupných v aktuálním kontextu vyhodnocení.

Nejprodávanější produkty pak můžeme nechat přímo vypsat v měřítku. Pouze musíme myslet na to, že výsledkem měřítka musí být skalární hodnota. Následující výpočet vrátí nejprodávanější produkt podle počtu prodaných kusů.

Měřítko:

Nejprodávanější produkt =
SELECTCOLUMNS
(
    TOPN
    (
        1,
        VALUES('Product'[Product]),
        CALCULATE(SUM(Sales[Order Quantity])),
        DESC
    ),
    "Produkt a množství",  
    [Product] &
    " - " &
    CALCULATE(SUM(Sales[Order Quantity])) &
    " Kusů"
)

Pokud měřítko použijeme v Power BI reportu bez jakýchkoliv filtrů, výsledkem bude produkt z největším množstvím prodaných kusů.

DAX funkce TOPN 6

V případě že do vizuálu tabulky přidáme kategorie produktů, a v průřezu vybereme jeden konkrétní rok, výsledkem měřítka bude nejprodávanější produkt v každé kategorii a vybraném roce.

DAX funkce TOPN 7

Jednotlivé argumenty, kromě argumentu pro určení způsobu řazení, můžeme určit dynamicky pomocí výrazů. Můžeme tak vytvořit například následující report, ve kterém si uživatel může vybrat počet nejlepších produktů k zobrazení a kritérium pro výběr produktů.

DAX funkce TOPN 8

Pokud vybereme jako kritérium pro výběr měřítko [Prodeje] a změníme počet zobrazených produktů na 7, výsledek měřítka se dynamicky změní.

DAX funkce TOPN 9

Takto vytvořené měřítko je již relativně komplexní a vrací výsledky na základě vybraných hodnot v průřezech. Tyto průřezy jsou vytvořeny v Power BI reportu jako parametry. Celé řešení by vydalo na samostatný příspěvek a je dostupné ke stažení níže pod tímto příspěvkem. Pro úplnost uvedu alespoň definici použitého měřítka.

Měřítko:

TOPN Nejprodávanější produkty (Počet a Řazení dynamicky) =
VAR PocetProduktu = [Parameter Value]
VAR ProduktyAProdaneKusy =  
    ADDCOLUMNS
    (
        VALUES('Product'[Product]),
        "VyberProduktuPodle",
        IF
        (
            SELECTEDVALUE('Parameter 2'[Parameter Order]) = 0,
            [Prodeje],
            [Počet kusů]
        )
    )
VAR TopProdukty =
    TOPN
    (
        PocetProduktu,
        ProduktyAProdaneKusy,
        [VyberProduktuPodle],
        DESC
    )
VAR Vysledek =
    CONCATENATEX
    (
        TopProdukty,
        [Product] & " - " & [VyberProduktuPodle],
        "
        ",
        [VyberProduktuPodle],
        DESC
    )
RETURN
    Vysledek

Smyslem poslední ukázky je pouze znázornit, že jednotlivé parametry funkce TOPN() mohou být vyplněny také dynamicky.  Praktický příklad použití funkce TOPN() můžete najít v samostatném příspěvku pod tímto odkazem. V odkazovaném článku je zobrazen postup, jak vytvořit v Power BI reportu Tooltip zobrazující TOPN nejlepších položek podle aktuálního kontextu vyhodnocení.

Oficiální Microsoft dokumentace funkce TOPN:
https://docs.microsoft.com/cs-cz/dax/topn-function-dax

Stáhnout soubor s řešením.
č. 53

Komentáře