Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX

Úvodní obrázek

Ve většině datových modelů v Power BI dochází k pravidelné aktualizaci dat, která mohou pocházet z různých zdrojů a v různé struktuře. Důvody pro nastavení pravidelných aktualizací jsou zřejmé. Ve zdrojových datech obvykle dochází v průběhu času ke změnám, a pokud chceme mít aktuální také reporty, musíme aktualizovat podkladová data nahraná v Tabulárním modelu. 

Při tvorbě Tabulárního modelu by měl každý autor zohledňovat také způsob, jakým dochází k aktualizaci záznamů ve zdrojových tabulkách. V tabulkách faktů jsou nové záznamy obvykle jednoduše přidávány k těm stávajícím. Naproti tomu ve filtrovacích tabulkách může docházet k aktualizaci dat více ruznými způsoby. V některých případech dojde při změně atributu u záznamu ve filtrovací tabulce k prostému přepsání původního záznamu novým, protože udržování historických záznamů nemusí dávat smysl. Protipólem proti tomuto přístupu je historizace záznamů. Při historizaci jsou původní záznamy nebo původní stavy atributů, u kterých došlo ke změnám, nějakým způsobem zachovávány a nedochází k jejich prostému přepsání. Typickým příkladem tabulky, ve které jsou udržovány také historické záznamy, je tabulka typu SCD 2 (Slowly changing dimension 2).

Pozn.: Filtrovací tabulka je v tabulárním modelu ekvivalentem dimenzní tabulky v multidimenzionálním modelu. Jedná se většinou o tabulku, která je ve vztahu MANY-TO-ONE na straně ONE.

Ve filtrovací tabulce typu SCD 2 dojde při změně některého z atributů k přidání nového záznamu s aktualizovanými údaji. Původní záznam je v tabulce zachován a často také nějakým způsobem označen jako neaktuální.

Jako příklad tabulky typu SCD 2 můžeme použít tabulku 'Employee'  ze cvičné databáze Adventure Works, která je v použitém souboru mírně upravena tak, aby odpovídala právě typu SCD 2.

Na obrázku níže můžeme tuto tabulku vidět, se všemi sloupci a všemi záznamy, tak jak bude použita v příkladech v tomto příspěvku a jak je nahrána v Power BI souboru, který je dostupný ke stažení níže pod tímto příspěvkem.  Tato tabulka je dále v použitém Power BI souboru nově pojmenována českým názvem 'Zaměstnanci', namísto originálního anglického názvu.

Tabulka 'Zaměstnanci' zobrazená na obrázku níže obsahuje záznamy o jednotlivých zaměstnancích, přes které v použitém modelu firma Adwenture Works prodává produkty zákazníkům. U dvou zvýrazněných zaměstnanců došlo v průběhu času mimo jiné ke změně jména.

Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX

U zaměstnance se jménem Jillian Carson došlo ke změně 28. 12. 2011. Od tohoto dne je již záznam označen jako neaktuální. Tento zaměstnanec se nově jmenuje Jill Carson a má nový záznam v tabulce, který je nyní nově označen jako aktuální (sloupec Status). Tento postup aktualizace záznamů odpovídá typu SCD2, kdy je původní záznam při aktualizaci dat zachován a nový záznam se změněnými údaji je do tabulky přidán.

Ke změně jména došlo také u Pamely Ansman, která se v průběhu času vdala a její jméno je nově Pamela Ansman-Wolfe.

Vždy když pracujeme s filtrovací tabulkou typu SCD 2, musíme si dávat pozor na způsob prezentace dat. Podívejme se například na následující vizuál, ve kterém jsou zobrazeny jména zaměstnanců v řádcích a suma prodejů přes tyto zaměstnance v hodnotách.

Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX 2

Zaměřme se opět na dva zaměstnance, u kterých došlo ke změně jména. Jak je možné vidět na obrázku výše, tito zaměstnanci mají ve vizuálu Tabulka každý dva samostatné řádky, jeden s původním jménem a jeden s aktuálním jménem. Takovýto pohled může za jistých okolností dávat smysl, nicméně pokud by chtěl některý z uživatelů reportu vyhledat kontakt na Pamelu Ansman nebo na Jilliana Carsona (původní jména před změnou), může nastat problém, protože zaměstnanci s tímto jménem již v telefonním seznamu pravděpodobně nebudou.

Tím se dostáváme k samotnému příkladu, jehož cílem je přiřadit všechny prodeje konkrétního zaměstnance k jeho aktuálnímu jménu. Jednou z možností je vytvoření nového počítaného sloupce, který bude u všech záznamů, které patří k jednomu zaměstnanci, obsahovat aktuální jméno (může jít o jakýkoliv jiný atribut). Uživatel reportu si pak bude moci výběrem sloupce zvolit, například pomocí Parametru polí,  zda chce vidět pohled přes aktuální hodnotu atributu (aktuální jméno), nebo přes atribut obsahující také historické záznamy. Rozdíl mezi těmito dvěma pohledy můžeme vidět na následujícím obrázku.

Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX 3

V levém vizuálu jsou použity historické i aktuální jména současně v souladu s tím, jak jsou data nahrána v originálním modelu před rozšířením tabulky o nový počítaný sloupec. Na obrázku vpravo je použitý pomocný sloupec pouze s aktuálními jmény, a pro zaměstnance, kteří si změnili jméno, jsou všechny jejich prodeje přiřazeny k novému jménu.

Pomocný sloupec s aktuálním jménem (nebo jakýmkoliv jiným atributem, který se v čase mění) můžeme vytvořit v jazyku DAX mnoha různými způsoby, ale vždy musíme vycházet ze struktury tabulky.

V použité tabulce se zaměstnanci máme například k dispozici sloupec, který obsahuje informaci, zda je konkrétní záznam aktuální (sloupec 'Zaměstnanci'[Status]).

Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX 4

Další důležitá informace je ve druhém sloupci na obrázku výše (sloupec 'Zaměstnanci'[EmployeeID]), ve kterém jsou uloženy jedinečné identifikátory každého zaměstnance, které se v čase nemění. Postup výpočtu bude na základě těchto dvou sloupců jednoduchý. Pro získání aktuálního jména u každého zaměstnance použijeme ve filtru funkce CALCULATE() jedinečný identifikátor zaměstnance uložený ve sloupci 'Zaměstnanci'[EmployeeID]. Tím dostaneme všechny záznamy, které patří vybranému zaměstnanci v aktuálním řádku. Dále přidáme filtr, ve kterém zafiltrujeme pouze aktuální záznam, to znamená záznam, který obsahuje ve sloupci 'Zaměstnanci'[Status] hodnotu "Current". Celý výpočet může vypadat následovně.

Počítaný sloupec:

Aktuální jméno =
VAR Zamestnanec = 'Zaměstnanci'[EmployeeID]
VAR AktualniJmenoZamestnance =
    CALCULATE
    (
        SELECTEDVALUE('Zaměstnanci'[Jméno], "Chyba"),
        REMOVEFILTERS('Zaměstnanci'),
        'Zaměstnanci'[EmployeeID] = Zamestnanec,
        'Zaměstnanci'[Status] = "Current"
    )
RETURN
    AktualniJmenoZamestnance

Nový počítaný sloupec je nyní součástí tabulky 'Zaměstnanci'.

Aktuální hodnota atributu v tabulce typu SCD 2 v Power BI a DAX 5

Pokud bychom v tabulce neměli informaci o tom, který záznam je právě aktuální a který je historický, můžeme použít alternativní výpočet, který bude vycházet z předpokladu, že novější záznam má vždy vyšší hodnotu ve sloupci 'Zaměstnanci'[EmployeeKey].

Počítaný sloupec:

Aktuální jméno 2 =
VAR Zamestnanec = 'Zaměstnanci'[EmployeeID]
VAR AktualniEmployeeKeyZamestnance =
    CALCULATE
    (
        MAX('Zaměstnanci'[EmployeeKey]),
        REMOVEFILTERS('Zaměstnanci'),
        'Zaměstnanci'[EmployeeID] = Zamestnanec
    )
VAR AktualniJmenoZamestnance =
    CALCULATE
    (
        SELECTEDVALUE('Zaměstnanci'[Jméno], "Chyba"),
        REMOVEFILTERS('Zaměstnanci'),
        'Zaměstnanci'[EmployeeKey] = AktualniEmployeeKeyZamestnance
    )
RETURN
    AktualniJmenoZamestnance

Obdobně bychom mohli místo sloupce 'Zamestannci'[EmployeeKey] použít sloupec s datumem, kde bychom využili stejného principu, tedy že novější záznam má vždy novější a tedy i vyšší datum. Výsledek obou počítaných sloupců je stejný. Alternativní výpočet je zde uveden pouze pro použití v situacích, kdy v tabulce není k dispozici informace o aktuálnosti nebo neaktuálnosti záznamu.

Nový počítaný sloupec můžeme následně používat v reportech jako kterýkoliv jiný sloupec. V ideální situaci bychom  měli takovýto pomocný sloupec načítat přímo ze zdrojové databáze, z důvodu lepší komprese dat v Tabulárním modelu. To je ovšem relevantní argument pouze u rozsáhlejších tabulek s mnoha tisíci záznamy. 

Na druhou stranu, požadavky na to, který atribut potřebujeme v reportech vidět pouze v jeho aktuální verzi, se mohou v době vývoje několikrát změnit, a proto je často daleko pružnější postup vytvořit si nový počítaný sloupec přímo v Tabulárním modelu pomocí jazyka DAX, tedy způsobem zobrazeným v tomto příspěvku. Další příklady můžete najít na stránce DAX - příklady nebo na stránce Power BI.

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

Komentáře