DAX funkce MIN a MAX

Funkce MIN a MAX v jazyku DAX

Funkce MIN() a MAX() jsou agregační funkce, které vrací nejmenší, respektive největší hodnotu ze sloupce zadaného v prvním argumentu. Obě funkce můžeme používat také se dvěma argumenty. Pokud chceme použít funkci MIN() nebo funkci MAX() se dvěma argumenty, výsledkem každého zadaného výrazu musí být skalární hodnota (jedna hodnota). Při použití funkcí MIN() nebo MAX() se dvěma argumenty bude výsledkem nejmenší hodnota ze dvou zadaných skalárních výrazů v případě funkce MIN(), a největší hodnota ze dvou skalárních výrazů v případě funkce MAX().

Tento příspěvek obsahuje několik vybraných příkladů použití DAX funkcí MIN() a MAX(), a to jak s jedním argumentem ve formě odkazu na sloupec, tak se dvěma argumenty ve formě skalárních výrazů.

Příklad použití DAX funkcí MIN a MAX

Příklady v tomto příspěvku 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 dostupný ke stažení níže pod tímto příspěvkem.

Funkce MIN() a MAX() vrací skalární hodnotu a můžeme je proto použít přímo v měřítku nebo v počítaném sloupci. Tyto funkce se ale častěji používají jako argumenty jiných funkcí v komplexnějších výpočtech. To ale neznamená že nemůžeme začít jednoduchým příkladem, ve kterém si pro každý produkt zobrazíme celkový počet prodaných kusů tohoto produktu, nejvyšší počet prodaných kusů a nejnižší počet prodaných kusů.

Tabulka 'Sales' obsahuje v každém řádku záznam o jednom prodaném produktu. Jedním ze sloupců v této tabulce je také sloupec s počtem prodaných kusů aktuálního produktu – sloupec 'Sales'[Order Quantity]. Měřítko s počtem prodaných kusů v aktuálním kontextu vyhodnocení tak bude jednoduše sčítat hodnoty z tohoto sloupce.

Měřítko:

Počet prodaných kusů = SUM(Sales[Order Quantity])

Pokud funkci SUM() z předchozího výpočtu nahradíme funkcí MAX(), dostaneme namísto součtu všech hodnot pouze jednu největší hodnotu ze zadaného sloupce, opět s ohledem na aktuální kontext vyhodnocení.

Měřítko:

Nejvíce prodaných kusů = MAX(Sales[Order Quantity])

A do třetice, pomocí funkce MIN() dostaneme nejnižší hodnotu ze sloupce s počtem prodaných kusů.

Měřítko:

Nejméně prodaných kusů = MIN(Sales[Order Quantity])

Pokud všechna tři nová měřítka vložíme do vizuálu Matrix, spolu s názvy produktů v řádcích vizuálu, výsledek může vypadat následovně.

DAX funkce MIN a MAX

Měřítko [Počet prodaných kusů] vrací celkový počet prodaných kusů vybraného produktu. Měřítko [Nejvíce prodaných kusů] vrací hodnotu, která představuje nejvyšší počet prodaných kusů v rámci jedné objednávky u daného produktu. Měřítko [Nejméně prodaných kusů] pak vrací u většiny produktů hodnotu 1, a toto číslo přestavuje nejmenší počet kusů prodaných najednou u každého produktu. Výjimkou je pouze produkt s názvem "Full-Finger Gloves, L", který byl prodán v rámci jedné objednávky vždy nejméně ve dvou kusech.

Funkce MIN() a MAX() můžeme používat ze všemi datovými typy, kromě sloupců ve formátu True/False. Se sloupcem ve formátu True/False můžeme pro zjištění největší nebo nejmenší hodnoty použít funkce MINA() a MAXA(). V jazyku DAX je hodnota TRUE větší než hodnota FALSE, protože ekvivalentem hodnoty TRUE je číslo 1, zatímco ekvivalentem hodnotu FALSE je číslo 0.

Dále, pokud použijeme funkce MIN() nebo MAX() se sloupcem s datovým typem Text, tak výsledkem bude nejmenší/největší hodnota podle abecedního pořadí. Pokud bychom například hledali nejmenší hodnotu ze sloupce, který je naformátovaný jako Text a obsahuje dvě hodnoty - hodnotu "105" a hodnotu "2", tak funkce MIN() by v tomto případě vrátila jako nejmenší hodnotu hodnotu "102", protože číslo 1 předchází v abecedě číslu 2. Z tohoto důvodu není příliš obvyklé použití funkce MIN() nebo MAX() nad hodnotami ve formátu Text.

Na druhou stranu, funkce MIN() a MAX() se často používají pro zjištění prvního nebo posledního dne v aktuálním kontextu vyhodnocení. Použití funkcí MIN() a MAX() s hodnotami ze sloupce ve formátu DATE, DATETIME nebo TIME je spolehlivé, protože všechny tyto sloupce jsou na pozadí převedeny na číslo, případně na číslo s desetinnou čárkou v případě datových typů TIME a DATETIME. Pro demonstraci použití funkcí MIN() a MAX() se sloupcem ve formátu DATE z datumové tabulky si můžeme vytvořit jednoduchý report s roky ve vizuálu Průřez a s měsíci v řádcích vizuálu Matice.

DAX funkce MIN a MAX 2

Do vizuálu Matrix si můžeme přidat měřítko, které bude vracet první den dostupný v aktuálním kontextu vyhodnocení.

Měřítko:

První den = MIN('Date'[Date])

Nahrazením funkce MIN() funkcí MAX() dostaneme poslední den dostupný v aktuálním kontextu vyhodnocení.

Měřítko:

Poslední den = MAX('Date'[Date])

Pokud obě nová měřítka vložíme do původního vizuálu, výsledek bude vypadat následovně.

DAX funkce MIN a MAX 3

Na obrázku výše můžeme vidět první a poslední den v každém měsíci a ve vybraném roce. To ještě není samo o sobě příliš zajímavé, nicméně hodnoty dvou nových měřítek můžeme použít v logickém filtru funkce CALCULATE(), a zobrazit si tak například prodeje za první den v aktuálním měsíci měsící.

Měřítko:

Prodeje první den =
VAR PrvniDen = MIN('Date'[Date])
VAR ProdejePrvniDen =
    CALCULATE
    (
        [Prodeje],
        'Date'[Date] = PrvniDen
    )
RETURN
    IF(NOT ISBLANK([Prodeje]), ProdejePrvniDen)

Pokud funkci MIN() ve výše uvedeném měřítku nahradíme funkcí MAX(), dostaneme prodeje za poslední, s ohledem na aktuální kontext vyhodnocení.

Měřítko:

Prodeje poslední den =
VAR PosledniDen = MAX('Date'[Date])
VAR ProdejePosledniDen =
    CALCULATE
    (
        [Prodeje],
        'Date'[Date] = PosledniDen
    )
RETURN
    IF(NOT ISBLANK([Prodeje]), ProdejePosledniDen)

Obě nová měřítka si můžeme vložit do původního vizuálu s měsíci v řádcích, a zobrazit si jejich výsledek.

DAX funkce MIN a MAX 4

Měřítko [Prodeje první den] vrací sumu za prodané produkty pouze za první den v daném měsíci. Měřítko [Prodeje poslední den] pak vrací v každém měsíci sumu za prodané produkty za poslední den v daném měsíci. V řádku souhrnů, kde na měřítka působí pouze filtr nastavený na rok 2019 v průřezu, vrací měřítko [Prodeje první den] prodeje za prodané produkty v prvním lednovém dni, zatímco měřítko [Prodeje poslední den] vrací v řádku souhrnů prodeje za poslední den v měsíci prosinec.

Jak už bylo uvedeno dříve, pokud chceme použít funkci MIN() nebo funkci MAX() se dvěma argumenty, výsledkem každého zadaného výrazu musí být skalární hodnota. Tuto podmínku splňuje také každé měřítko, protože výsledkem měřítka je vždy pouze jedna hodnota.

Pozn.: Podíváme-li se na předchozí obrázek s vizuálem Matice, tak měřítko [Prodeje], stejně jako ostatní měřítka, vrací v tomto vizuálu více než jednu hodnotu. Každé měřítko je ale vyhodnoceno v každé buňce vizuálu samostatně, a v jednotlivých buňkách je výsledkem měřítka vždy pouze jedna skalární hodnota.

To, že každé měřítko vrací skalární hodnotu, můžeme využít pro znázornění chování funkcí MIN() a MAX() se dvěma argumenty. Následující měřítko bude vracet výsledek jednoho ze zadaných měřítek, které bude v aktuálním kontextu vyhodnocení vracet vyšší hodnotu.

Měřítko:

Vyšší prodeje = MAX([Prodeje první den], [Prodeje poslední den])

Pokud nové měřítko přidáme do původního vizuálu s měsíci v řádcích, výsledek bude vypadat následovně.

DAX funkce MIN a MAX 5

Nové měřítko [Vyšší prodeje] vyhodnotí, které z měřítek [Prodeje první den] a [Prodeje poslední den] vrací vyšší hodnotu, a tuto hodnotu vrátí. V měsíci leden tak měřítko [Vyšší prodeje] vrací prodeje za první den v měsíci, protože ty byly vyšší než prodeje za poslední den v tomto měsíci. V měsíci únor byla situace opačná, a měřítko [Vyšší prodeje] vrací prodeje za poslední den v měsíci, které byly vyšší než prodeje za první den v měsíci únor. Pokud funkci MAX() v měřítku [Vyšší prodeje] nahradíme funkcí MIN(), dostaneme nižší hodnotu ze dvou zadaných měřítek.

Měřítko:

Nižší prodeje = MIN([Prodeje první den], [Prodeje poslední den])

Nové měřítko si opět můžeme vložit do stejného vizuálu a zobrazit si výsledky.

DAX funkce MIN a MAX 6

Nové měřítko [Nižší prodeje] nyní vybírá v každém řádku vizuálu nižší hodnotu mezi měřítky [Prodeje první den] a [Prodeje poslední den].

Zvláštní pozornost bychom měli věnovat použití funkcí MIN() a MAX() v počítaném sloupci, kde na výpočet nepůsobí žádné vnější filtry, jako je tomu ve vizuálech v reportech.

Následující výpočet v novém počítaném sloupci v tabulce 'Sales' bude vracet v každém řádku stejnou hodnotu, která bude odpovídat nejvyšší hodnotě ze sloupce zadaného v argumentu funkce MAX().

Počítaný sloupec:

Nejvíce prodaných kusů = MAX(Sales[Order Quantity])

Výpočet je v případě vyhodnocení v počítaném sloupci vyhodnocen v kontextu řádku, a agregační funkce kontext řádku ignorují. Proto je výsledkem nového počítaného sloupce stejná hodnota v každém řádku tabulky, která odpovídá největší hodnotě ze sloupce 'Sales'[Order Quantity].

DAX funkce MIN a MAX 7

Chování funkcí MAX() a MIN() se ale změní, pokud tyto funkce použijeme v počítaném sloupci se dvěma argumenty. V takovém případě můžeme v kontextu řádku použít přímý odkaz na sloupec, a výsledkem bude vyšší/nižší hodnota ze dvou zadaných sloupců v aktuálním řádku. Následující počítaný sloupec bude například vracet v každém řádku  buď hodnotu ze sloupce 'Sales'[Total Product Cost], nebo hodnotu ze sloupce 'Sales'[Sales Amount], podle toho která z hodnot bude v aktuálním řádku vyšší.

Počítaný sloupec:

Vyšší tržba nebo náklady = MAX(Sales[Total Product Cost], Sales[Sales Amount])

Výsledek nového počítaného sloupce můžeme vidět na následujícím obrázku.

DAX funkce MIN a MAX 8

Za zmínku ještě stojí, že ve funkcích MIN() a MAX() můžeme zadat jeden nebo oba argumenty ve formě konstanty. Můžeme si tak například vytvořit další počítaný sloupec, který bude vracet aktuální slevu v případě, že je větší než 5 %. Pokud bude sleva nižší než 5 % nebo žádná, použijeme konstantu a nastavíme slevu plošně na 5 %.

Počítaný sloupec:

Nová sleva = MAX(Sales[Unit Price Discount Pct], 0.05)

Nyní bude v novém počítaném sloupci u všech produktů uvedena sleva minimálně 5 %. Pokud byla v některém z řádků v původním sloupci s názvem 'Sales'[Unit Price Discount Pct] sleva vyšší než 5 %, bude v těchto případech vybrána původní vyšší sleva.

DAX funkce MIN a MAX 9

Jak můžeme vidět na obrázku výše, tak například v prvním řádku zobrazené tabulky je vybrána v novém počítaném sloupci hodnota z původního sloupce se slevou, protože je tato hodnota vyšší než námi zadaná konstanta 0.05 (5 %). Ve druhém řádku již je ale výsledkem nového počítaného sloupce hodnota 5 %, protože v původním sloupci se slevou byla zadána sleva nižší, a to 2 %.

Shrnutí

Všechny příklady uvedené v tomto příspěvku jsou pouze ilustrativní s cílem vysvětlit chování funkcí MIN() a MAX() v kontextu řádku, v kontextu filtru a s použitím s jedním nebo se dvěma argumenty. Praktické příklady, některé také s použitím funkcí MIN() a MAX(), můžete najít na stránce DAX příklady nebo na stránce Power BI.

Oficiální Microsoft dokumentace funkcí MAX a MIN:
https://learn.microsoft.com/cs-cz/dax/max-function-dax
https://learn.microsoft.com/cs-cz/dax/min-function-dax

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

Komentáře