Tento článek popisuje, jak v daxovém výpočtu porovnávat všechny řádky s aktuálním. Jako např. v této tabulce. Máme lidi, kteří mají počet bodů, a naším úkolem je zjistit, na jaké pozici se umístili – kdo má nejvíce bodů, skončil na první pozici, atd.

Než se pustíme do vysvětlování, tak jen dvě upozornění:

  • Tento výpočet se týká řádkového kontextu, použijete ho tedy pro dopočítání nového sloupce (ne míry).
  • Tento konkrétní případ by šel řešit i funkcí RANK.EQ, nám jde ale o vysvětlení principu, který bychom mohli využít i u složitějších výpočtů – viz další příklad.

V čem je vlastně problém?

Asi by vás napadlo začít nějak takhle:

  • = COUNTROWS(
       FILTER(
       ‘times’,
          …

jenže teď přijde ten problém. Potřebujete definovat, že hodnota Points v tabulce, kterou postupně procházíme, musí být vyšší než hodnota Points u konkrétního člověka. Jak ale odlišit tyto dvě “Points”?

Využijeme práce s kontextem:

  • Position =
    var his_points = ‘times'[Points]
    var his_rank = COUNTROWS(
       FILTER(
       ‘times’,
          ‘times'[Points]>his_points))
    return
       his_rank+1

Proč takhle?

Na začátku si definujeme proměnnou his_points, reprezentující body řádku, pro který počítáme pořadí. V tuto chvíli jsme ještě v řádkovém kontextu, takže třeba pro Betty získáme číslo 98.

Tuto hodnotu si v proměnné zapamatujeme.

V další proměnné pak funkcí FILTER budeme procházet všechny řádky (kontext je tedy rozšířený na celou tabulku). Nicméně proměnná his_points už je spočtená z dřívějška, takže to funguje.

Výpočet by šel udělat i trochu jinak – pomocí funkce EARLIER.

  • Position earlier = COUNTROWS(
    FILTER(‘times’,
    ‘times'[Points]>EARLIER(times[Points])))
    +1