Min, max a průměr z řádku tabulky do počítaného sloupce v jazyku DAX

Úvodní obrázek

V tomto příspěvku si ukážeme jeden z možných postupů, pomocí kterého můžeme z hodnot, které pocházejí z více sloupců jednoho řádku tabulky získat agregovanou hodnotu v novém počítaném sloupci. Typ zamýšlené agregace není pro použitou logiku zásadní, a může být jednoduše vybrán volbou adekvátní DAX funkce. Například pomocí funkce MAXX() můžeme získat nejvyšší hodnotu z jednoho řádku tabulky, pomocí funkce AVERAGEX() průměrovat hodnoty, pomocí funkce MINX() získáme minimální hodnotu z více sloupců jednoho řádku tabulky, a tak dále.

K tomuto tématu je k dispozici také video:

Pro zjednodušení budeme v tomto příspěvku pracovat z jednou malou tabulkou, která obsahuje záznamy o teplotách naměřených ve vybraných městech.

Poznámka: Použitá tabulka zobrazená na obrázku níže záměrně není ve správné struktuře z pohledu datového modelování. Ve správně strukturované tabulce by měly být časy měření v samostatném sloupci, a naměřené hodnoty pouze v jednom sloupci. Čas měření by pak byl ve správně strukturované tabulce určen aktuálním časem v aktuálním řádku tabulky.

Min, max a průměr z řádku tabulky do počítaného sloupce v jazyku DAX

Použitá tabulka má 8 sloupců. V prvním sloupci je název města, ve druhém sloupci den, ve kterém došlo k měření teplot, a v dalších sloupcích naměřené teploty.

Představme si nyní situaci, kdy bychom chtěli v této tabulce vytvořit tři nové počítané sloupce. První sloupec by obsahoval nejvyšší denní teplotu, druhý sloupec nejnižší denní teplotu, a třetí sloupec průměrnou denní teplotu.

Celý problém si můžeme popsat na výpočtu nejvyšší denní naměřené teploty. K tomuto účelu by se jako první pravděpodobně nabízela funkce MAX(). Problémem ale je, že všechny agregační funkce jsou primárně určené pro agregace hodnot z jednoho sloupce, a ne z jednoho řádku tabulky. Funkce MAX() a funkce MIN() sice mohou být použity také se dvěma argumenty, kdy výsledkem bude nejvyšší, respektive nejnižší hodnota ze dvou vložených hodnot. My ale chceme získat nejvyšší hodnotu ze šesti sloupců, a při použití funkce MAX() bychom tak museli vnořit pět těchto funkcí do sebe.

U průměru, produktu a nebo u dalších typů agregací bychom pak museli hledat jiné řešení, protože například ve funkci SUM() a nebo ve funkci AVERAGE() již nemůžeme použít dva argumenty, a vnořování těchto funkcí by nám náš problém již nevyřešilo.

Proto si ukážeme univerzální postup, který bude vracet agregovanou hodnotu z více sloupců z jednoho řádku tabulky, kdy typ agregace bude záležet pouze na použité funkci.

Celá logika není nijak složitá. V novém počítaném sloupci si nejprve pomocí konstruktoru tabulky vytvoříme z jednotlivých hodnot v řádcích novou virtuální tabulku. Konstruktor tabulky se vytváří pomocí složených závorek. Do konstruktoru tabulky bude stačit vložit odkazy na jednotlivé sloupce, které chceme pro výpočet použít. V počítaném sloupci totiž pracujeme s kontextem řádku, který nám zajistí přístup k aktuální hodnotě z každého použitého sloupce.

Následně můžeme tuto virtuální tabulku vytvořenou pomocí konstruktoru tabulky vložit do jakékoliv agregační nebo statistické funkce, která má na konci názvu písmeno X. Funkce s X na konci názvu totiž přijímají v prvním argumentu tabulku, a ve druhém argumentu odkaz na sloupec z této tabulky určený k agregaci.

Pro získání nejvyšší hodnoty ze všech naměřených hodnot v aktuálním řádku tabulky tak můžeme použít například následující definici nového počítaného sloupce.

Počítaný sloupec:

Nejvyšší hodnota =
MAXX
(
    {
        'Města a teploty'[6:00],
        'Města a teploty'[9:00],
        'Města a teploty'[12:00],
        'Města a teploty'[15:00],
        'Města a teploty'[18:00],
        'Města a teploty'[21:00]
    },
    [Value]
)

Prvním argumentem funkce MAXX() je tabulka, která obsahuje jeden sloupec se všemi hodnotami měření z aktuálního řádku tabulky. Následně funkce MAXX() vybere z tohoto sloupce nejvyšší hodnotu. Druhým argumentem funkce MAXX() je odkaz na sloupec z tabulky vytvořené konstruktorem tabulky, kdy tento sloupec je automaticky pojmenovaný názvem [Value].

Pokud bychom pro daný den chtěli získat nejnižší naměřenou hodnotu, stačí nahradit funkci MAXX() funkcí MINX() následujícím způsobem.

Počítaný sloupec:

Nejnižší hodnota =
MINX
(
    {
        'Města a teploty'[6:00],
        'Města a teploty'[9:00],
        'Města a teploty'[12:00],
        'Města a teploty'[15:00],
        'Města a teploty'[18:00],
        'Města a teploty'[21:00]
    },
    [Value]
)

Pro výpočet průměru pak použijeme funkci AVERAGEX().

Počítaný sloupec:

Průměrná hodnota =
AVERAGEX
(
    {
        'Města a teploty'[6:00],
        'Města a teploty'[9:00],
        'Města a teploty'[12:00],
        'Města a teploty'[15:00],
        'Města a teploty'[18:00],
        'Města a teploty'[21:00]
    },
    [Value]
)

Výsledná tabulka se všemi novými počítanými sloupci pak vypadá následovně.

Min, max a průměr z řádku tabulky do počítaného sloupce v jazyku DAX 2

Jak je možné vidět na obrázku výše, sloupec 'Města a teploty'[Nejvyšší hodnota] obsahuje nejvyšší denní naměřené hodnoty z každého řádku tabulky. Sloupec 'Města a teploty'[Nejnižší hodnota] obsahuje nejnižší denní hodnoty a poslední sloupec obsahuje průměrné denní hodnoty.

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

Komentáře