DAX funkce MAXX a MINX

Úvodní obrázek

Funkce MAXX() a MINX() jsou agregační a současně iterační funkce se dvěma povinnými argumenty. Prvním argumentem obou funkcí je tabulka. Druhým argumentem je výraz, který je vyhodnocen v kontextu řádku tabulky zadané v prvním argumentu. Výsledkem je pak největší, respektive nejmenší hodnota ze všech výsledků výrazu uvedeného ve druhém argumentu.

Tento příspěvek obsahuje vybrané příklady s použitím funkcí MAXX() a MINX() s cílem vysvětlit, jak tyto funkce fungují. Příklady jsou vytvořeny ve cvičném Power BI souboru Adventure Works DW 2020.pbix, který je volně dostupný ke stažení na internetu. Soubor s řešením je k dispozici ke stažení níže pod tímto příspěvkem.

Příklad použití funkcí MAXX a MINX

V použitém cvičném modelu jsou ve faktové tabulce 'Sales' záznamy o prodaných produktech. Jeden konkrétní produkt se v průběhu času mohl prodávat za různé ceny podle toho, zda došlo ke zdražení, nebo naopak ke zlevnění produktu. Pokud bychom chtěli zobrazit v reportu maximální nebo minimální cenu, za kterou byl daný produkt alespoň jednou prodán, vystačíme si s funkcemi MAX() a MIN().

Měřítka:

Nejvyšší jednotková cena (MAX) = MAX(Sales[Unit Price])
Nejnižší jednotková cena (MIN) = MIN(Sales[Unit Price])

Pokud nová měřítka vložíme do vizuálu Matice, spolu s produkty v řádcích, můžeme u každého produktu vidět nejvyšší a nejnižší cenu, za jakou byl tento produkt v průběhu času prodáván.

DAX funkce MAXX a MINX

Stejného výsledku můžeme dosáhnout také při použití funkcí MAXX() a MINX() následujícím způsobem.

Měřítka:

Nejnižší jednotková cena (MINX) =
MINX
(
    Sales,
    Sales[Unit Price]
)
Nejvyšší jednotková cena (MAXX) =
MAXX
(
    Sales,
    Sales[Unit Price]
)

Pokud vložíme obě nová měřítka do stejného vizuálu, tak při vyhodnocení těchto měřítek dojde v prvním kroku k zafiltrování tabulky 'Sales' v prvním argumentu obou funkcí pouze na ty prodané produkty, které odpovídají produktu v aktuálním řádku vizuálu. Následně v takto zafiltrované tabulce dojde řádek o řádku k vyhodnocení druhého argumentu. Funkce MAXX() potom vrátí nejvyšší hodnotu ze všech jednotkových cen pro daný produkt, a funkce MINX() nejnižší jednotkovou cenu. Ve skutečnosti, kdykoliv když použijeme funkci MAX() nebo MIN() s jedním argumentem ve formě odkazu na sloupec, jsou tyto funkce vyhodnoceny úplně stejně jako funkce MAXX() a MINX(), kde je ve druhém argumentu odkaz na sloupec, a v prvním argumentu tabulka, ze které tento sloupec pochází. Výsledky obou variant měřítek jsou proto také stejné.

DAX funkce MAXX a MINX 2

Výhodou funkcí MAXX() a MINX() je, že v prvním argumentu těchto funkcí můžeme použít jakoukoliv tabulku, včetně funkcí vracející tabulky, a ve druhém argumentu můžeme použít jakýkoliv výraz vracející v aktuálním kontextu skalární hodnotu. Pomocí funkcí MAXX() a MINX() tak můžeme například rozvinout původní výpočet. Každý záznam ve faktové tabulce 'Sales' obsahuje jednotkovou cenu ve sloupci 'Sales'[Unit Price], a dále také počet prodaných kusů ve sloupci 'Sales'[Order Quantity]. Pokud bychom se tedy nespokojili pouze s nejnižší nebo nejvyšší jednotkovou cenou, ale chtěli bychom vědět nejvyšší a nejnižší částku utracenou za daný produkt v rámci jedné objednávky, můžeme ve druhém argumentu funkcí MAXX() a MINX() vynásobit jednotkovou cenu počtem objednaných kusů.

Měřítka:

Nejnižší nákup =
MINX
(
    Sales,
    Sales[Unit Price] * Sales[Order Quantity]
)
Nejvyšší nákup =
MAXX
(
    Sales,
    Sales[Unit Price] * Sales[Order Quantity]
)

Nově vytvořená měřítka si můžeme vložit opět do stejného vizuálu s názvy produktů v řádcích a zobrazit si výsledek.

DAX funkce MAXX a MINX 3

Na obrázku výše můžeme vidět, že produkt s názvem "All-Purpose Bike Stand" uvedený v prvním řádku vizuálu byl vždy prodáván za stejnou cenu, a navíc byl vždy prodáván pouze po jednom kusu. Ve druhém řádku již byl nejvyšší nákup produktu s názvem "AWC Logo Cap" výrazně vyšší, než je jeho nejvyšší jednotková cena. To znamená že tento nejvyšší nákup tohoto konkrétního produktu zahrnoval více prodaných kusů najednou.

Měřítko [Nejnižší nákup] pak pro většinu produktů bude vracet hodnotu z řádku v tabulce 'Sales', ve kterém je záznam pouze s jedním prodaným kusem, nicméně jak můžeme vidět na obrázku výše, nemuselo se vždy jednat o prodej produktu za jeho nejnižší jednotkovou cenu. To znamená, že u těchto produktů bylo dosaženo nejnižší jednotkové ceny u prodejů s větším počtem odebraných kusů.

Ve druhém argumentu funkcí MAXX() a MINX() můžeme použít jakýkoliv výraz, včetně měřítek, který bude vracet v kontextu řádku tabulky v prvním argumentu skalární hodnotu. Můžeme si tak například vytvořit následující dvě jednoduchá měřítka, která budou vracet nejvyšší, respektive nejnižší denní prodeje v aktuálním kontextu vyhodnocení.

Měřítka:

Nejnižší denní prodeje =
MINX
(
    'Date',
    [Prodeje]
)
Nejvyšší denní prodeje =
MAXX
(
    'Date',
    [Prodeje]
)

Nová měřítka si můžeme vložit do vizuálu Matice s měsíci v řádcích. Pokud současně v průřezu vybereme pouze jeden konkrétní rok, měřítko [Nejvyšší denní prodeje] bude vracet hodnotu, která představuje nejvyšší denní tržby v daném měsíci vybraného roku. Měřítko [Nejnižší denní prodeje] pak bude vracet nejnižší denní tržby, opět s ohledem na aktuální kontext vyhodnocení.

DAX funkce MAXX a MINX 4

Další důležitou vlastností obou popisovaných funkcí je, že jak funkce MAXX(), tak funkce MINX() může obsahovat ve druhém argumentu odkaz na sloupec vytvořený pomocí výrazu ve virtuální tabulce dostupné pouze v rámci aktuálního výpočtu. Tento typ výpočtu můžeme vidět v následujícím měřítku.

Měřítko:

Prodeje nejlepšího produktu =
VAR ProduktyAProdeje =
    ADDCOLUMNS
    (
        VALUES('Product'[Product]),
        "@Prodeje",
        [Prodeje]
    )
VAR ProdejeNejlepsiProdukt =
    MAXX
    (
        ProduktyAProdeje,
        [@Prodeje]
    )
RETURN
    ProdejeNejlepsiProdukt

V měřítku [Prodeje nejlepšího produktu] bude první proměnná obsahovat virtuální tabulku, ve které pomocí funkce ADCOLUMNS() přidáváme k názvům produktů nový počítaný sloupec. Tento nový sloupec bude obsahovat sumu za prodeje pro každý produkt. Tuto virtuální tabulku následně můžeme použít ve funkci MAXX(), a vybrat z ní nejvyšší hodnotu z nově vytvořeného sloupce. Výsledkem je hodnota představující tržby za produkt s nevyšší inkasovanou částkou v aktuálním kontextu vyhodnocení.

DAX funkce MAXX a MINX 5

Všechny příklady v tomto příspěvku jsou pouze ilustrativní s cílem vysvětlit fungování funkcí MAXX() a MINX(). Praktické příklady můžete najít na stránce DAX – příklady nebo na stránce Power BI.

Oficiální Microsoft dokumentace funkcí MAXX a MINX:
https://learn.microsoft.com/cs-cz/dax/maxx-function-dax
https://learn.microsoft.com/cs-cz/dax/minx-function-dax

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

Komentáře