DAX funkce RANKX

DAX funkce RANKX()

DAX funkce RANKX() vrací pořadí aktuální hodnoty v porovnání se seznamem hodnot. Seznam hodnot je vytvořený na základě tabulky v prvním argumentu funkce a výrazu ve druhém argumentu. Funkce RANKX() je jedna ze složitějších funkcí v jazyku DAX, především z důvodu rozdílných kontextů vyhodnocení jednotlivých argumentů. Způsob použití funkce RANKX() v počítaném sloupci a v měřítku je také jiný. Výpočet vytvořený pro měřítku nemusí fungovat v počítaném sloupci, a naopak.

V tomto příspěvku si proto ukážeme různé způsoby použití funkce RANKX() jak v měřítku, tak v počítaném sloupci.

Poznámka:

V jazyku DAX je pro účely vytvoření pořadí k dispozici také novější funkce RANK(), která patří do kategorie takzvaných WINDOW funkcí. Tato nová funkce odstraňuje některé nedostatky starší funkce RANKX(), které je věnován tento příspěvek. Pokud tedy potřebujete vytvořit pořadí, ať už v měřítku, počítaném sloupci nebo ve vizuálním výpočtu, zvažte k tomuto účelu použití novější funkce RANK(). Více informací o funkci RANK() můžete najít v samostatném příspěvku pod tímto odkazem.

DAX funkce RANKX

Pro začátek se můžeme podívat na syntaxi funkce RANKX(). První dva argumenty funkce jsou povinné, zbývající tři argumenty jsou volitelné.

Syntaxe funkce RANKX():

RANKX(<tabulka>, <výraz>[, <hodnota>[, <řazení>[, <vazby>]]])

Tabulka v první argumentu funkce je vyhodnocena v originálním kontextu vyhodnocení. Výraz ve druhém argumentu v kontextu řádku tabulky v prvním argumentu. Třetí argument funkce je vyhodnocen v originálním kontextu, ve kterém je funkce RANKX() použita. Pokud neuvedeme třetí argument funkce, tak je druhý argumentu funkce vyhodnocen znovu, a to opět v originálním kontextu vyhodnocení, namísto vynechaného třetího argumentu.

Ve čtvrtém argumentu můžeme zvolit způsob řazení, a to buď sestupně (DESC) nebo vzestupně (ASC). Pokud čtvrtý argument vynecháme, způsob řazení bude sestupné (DESC). Pátý argument vyjadřuje způsob, jak chceme pracovat s hodnotami, které mají případně stejné pořadí. Můžeme zvolit možnost SKIP nebo DENSE. Pokud nepoužijeme pátý argument, hodnoty budou uvedeny ve vazbách SKIP. V následující tabulce jsou uvedeny příklady funkce RANKX() se všemi kombinacemi čtvrtého a pátého argumentu.

DAX funkce RANKX 2

Funkce RANKX() může vracet neočekávané výsledky při práci s hodnotami ve formátu DECIMAL (plovoucí desetinná čárka), a to z důvodu zaokrouhlování. V oficiální dokumentaci proto najdeme doporučení používat tuto funkci s hodnotami v ostatních formátech, nebo případně použít s hodnotami ve formátu DECIMAL zaokrouhlovací funkci ROUND().

Pokud chceme některý z argumentů funkce RANKX() přeskočit, vkládáme místo vynechaných argumentů čárku, viz příklady níže v tomto příspěvku.

Všechny níže uvedené 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 dostupný ke stažení níže pod tímto příspěvkem.

Příklady RANKX v počítaném sloupci

V prvním příkladu si můžeme vytvořit nový počítaný sloupec v tabulce 'Product', který bude obsahovat řazení produktů podle celkové sumy utržené za prodeje každého produktu. Měřítko vracející sumu prodejů v aktuálním kontextu vyhodnocení má následující definici.

Měřítko:

Prodeje = SUM(Sales[Sales Amount])

Počítaný sloupec s pořadím produktů podle sumy prodejů v tabulce 'Product' pak může vypadat následovně.

Počítaný sloupec:

(Počítaný sloupec) Pořadí podle prodejů =
RANKX
(
    'Product',
    [Prodeje]
)

V prvním argumentu funkce RANKX() je tabulka 'Product', ve které je v kontextu řádku vyhodnocen druhý argument. Tato tabulka pak slouží jako seznam hodnot, který bude prohledaný pro určení pořadí aktuálního produktu. Nejdříve je však vyhodnocen znovu druhý argument funkce v originálním kontextu vyhodnocení, tedy v řádku, kde je funkce RANKX() použita, a tato hodnota je pak vyhledána v dříve vytvořeném seznamu. Výsledkem je pozice, na které je hledaná hodnota nalezena v seznamu hodnot.

DAX funkce RANKX 3

Protože je druhý argument funkce RANKX() vyhodnocen v kontextu řádku tabulky v prvním argumentu, můžeme přistupovat přímo ke všem hodnotám v použité tabulce. Následujícím způsobem tak můžeme vytvořit pořadí produktů podle katalogové ceny produktů, která je součástí tabulky 'Product'.

Počítaný sloupec:

(Počítaný sloupec) Poradí podle ceny =
RANKX
(
    'Product',
    'Product'[List Price],
    ,
    ,
    DENSE
)

Produkty se stejnou katalogovou cenou jsou pak v pořadí zařazeny na stejné místo, bezprostředně následující za předchozí hodnotou, díky volbě DENSE v pátém argumentu funkce RANKX().

DAX funkce RANKX 4

V prvním argumentu funkce RANKX() můžeme používat také funkce vracející tabulky. Následující výraz tak vytvoří pořadí produktů v rámci kategorie, do které aktuální produkt patří.

Počítaný sloupec:

(Počítaný sloupec) Pořadí podle prodejů v kategorii =
RANKX
(
    FILTER
    (
        'Product',
        'Product'[Category] = EARLIER('Product'[Category])
    ),
    [Prodeje]
)

Na obrázku níže si můžeme porovnat pořadí vytvořené podle prodejů přes všechny produkty a pořadí podle prodejů vytvořené pouze v kategorii, do které daný produkt patří.

DAX funkce RANKX 5

Počítaný sloupec 'Product'[(Počítaný sloupec) Pořadí podle prodejů v kategorii] obsahuje pořadí produktů pro každou kategorii zvlášť, zatímco v počítaném sloupci 'Product'[(Počítaný sloupec) Pořadí podle prodejů] je vytvořené pořadí přes všechny produkty bez ohledu na kategorii, do které aktuální produkt patří.

Výpočet určený pro počítaný sloupec obvykle nebude fungovat správně v měřítku z důvodu jiného kontextu vyhodnocení. V následující části jsou proto uvedeny příklady použití funkce RANKX() v měřítku.

Příklady RANKX v měřítku

Jak již bylo uvedeno dříve, způsob použití funkce RANKX() v měřítku a v počítaném sloupci je jiný. Při vyhodnocení měřítka v reportech jsou obvykle aktivní filtry. Proto je ve většině případů nutné vložit tabulku v prvním argumentu funkce RANKX() do některé z ALL* funkcí, které vnější filtry ignorují nebo reflektují pouze částečně.

Na následujícím obrázku jsou ve vizuálu Tabulka jednotlivé modely produktů z tabulky 'Product' a měřítko [Prodeje] vracející sumu za prodané produkty v dané modelové řadě.

DAX funkce RANKX 6

Měřítko [Prodeje] je vyhodnoceno v kontextu filtru každého modelu. Na měřítko tedy působí filtr v každém řádku použitého vizuálu. Stejně tak budou působit filtry na vyhodnocení měřítka obsahující funkci RANKX(). Tabulka v prvním argumentu funkce RANKX() musí v tomto případě ignorovat filtr působící v každém řádku použitého vizuálu, aby mohla funkce RANKX() vytvořit kompletní seznam ze všech modelů zobrazených ve vizuálu. Pořadí modelů podle prodejů můžeme získat pomocí následujícího měřítka.

Měřítko:

(Měřítko) Pořadí modelů podle prodejů =
IF
(
    ISINSCOPE('Product'[Model]),
    RANKX
    (
        ALL('Product'[Model]),
        [Prodeje]
    )
)

Při definici měřítka určeného pouze pro konkrétní typ vizualizace je ještě dobré ověřit si před vyhodnocením výpočtu, zda je měřítko použité ve správném kontextu. Proto je funkce RANKX() ve výše uvedeném výpočtu vložena do funkce IF(), ve které v prvním argumentu ověřujeme, zda je měřítko vyhodnoceno v kontextu hodnot ze sloupce 'Product'[Model]. Pokud ano, výsledkem bude pořadí aktuálního modelu podle prodejů. V opačném případě bude výsledkem měřítka hodnota BLANK.

DAX funkce RANKX 7

Jak je vidět na obrázku výše, měřítko [(Měřítko) Pořadí modelů podle prodejů] vrací v každém řádku pořadí aktuálního modelu podle sumy za prodané produkty v dané modelové řadě. Pokud v průřezu na levé straně Power BI reportu vybereme pouze některé modely, měřítko s pořadím bude vracet pořadí aktuálního modelu stále v porovnání se všemi modely, bez ohledu na filtr nastavený v průřezu.

DAX funkce RANKX 8

Důvodem je funkce ALL() v prvním argumentu funkce RANKX(), která ignoruje všechny filtry aplikované na sloupec 'Product'[Model], ať už se jedná o filtry z řádku vizuálu Tabulky nebo z průřezu. Pokud bychom chtěli vytvořit pořadí pouze pro modely vybrané v průřezu, můžeme v prvním argumentu funkce RANKX() použít místo funkce ALL()funkci ALLSELECTED().

Měřítko:

(Měřítko) Pořadí modelů podle prodejů 2 =
IF
(
    ISINSCOPE('Product'[Model]),
    RANKX
    (
        ALLSELECTED('Product'[Model]),
        [Prodeje]
    )
)

Novou variantu výpočtu si můžeme porovnat s původním měřítkem.

DAX funkce RANKX 9

Jak je možné vidět na obrázku výše, nové měřítko vrací pořadí modelů na základě seznamu hodnot, který obsahuje pouze modely vybrané v průřezu.

Příklady častých chyb při použití funkce RANKX() jsou shrnuty v samostatném příspěvku. V tomto příspěvku je také uvedena jedna ze situací, kdy je nutné použít třetí argument funkce RANKX() pro dosažení očekávaného výsledku.

Shrnutí

Funkce RANKX() je jedna ze složitějších funkcí v jazyku DAX. Pokud funkce RANKX() nevrací očekávané výsledky, musíme se zaměřit na kontext, ve kterém je funkce RANKX() vyhodnocena, a především na kontexty, ve kterých jsou vyhodnoceny jednotlivé argumenty této funkce. Tabulka v prvním argumentu funkce RANKX() je vyhodnocena v originálním kontextu. Druhý argument je vyhodnocen v kontextu řádku tabulky z prvního argumentu a třetí argument je opět vyhodnocen v originálním kontextu, ve kterém je funkce použita. Pokud třetí argument není zadán, je místo třetího argumentu vyhodnocen v originálním kontextu znovu argument druhý. 

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

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

Komentáře