Ďalšie výpočty časovej inteligencie

Dokončené

Existujú aj iné funkcie časovej inteligencie jazyka DAX, ktoré sa týkajú vrátenia jedného dátumu. O týchto funkciách sa dozviete tak, že ich použijete v dvoch rôznych scenároch.

Funkcie FIRSTDATE DAX a LASTDATE vrátia prvý a posledný dátum v aktuálnom kontexte filtra pre zadaný stĺpec dátumov.

Vypočítanie nových výskytov

Ďalším využitím funkcií časovej inteligencie je spočítanie nových výskytov. Nasledujúci príklad znázorňuje, ako môžete vypočítať počet nových zákazníkov za určité časové obdobie. Nový zákazník sa započítava do časového obdobia, v ktorom uskutočnil svoj prvý nákup.

Vašou prvou úlohou je pridať nasledujúcu mierku do tabuľky Sales (Predaj ), ktorá vypočíta počet jednotlivých zákazníkov obdobia od začiatku do súčasnosti (LTD). Od začiatku do súčasnosti znamená od počiatočného dátumu až do posledného dátumu v kontexte filtra. Naformátujte mierku ako celé číslo pomocou oddeľovača tisícok.

Customers LTD =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD

Do vizuálu matice pridajte mierku Zákazníci LTD. Všimnite si, že sa vypočíta počet jednotlivých LTD zákazníkov až do konca každého mesiaca.

Obrázok zobrazuje vizuál matice so zoskupenými údajmi rokov a mesiacov v riadkoch a súhrnmi výnosov, výnosov YTD a LTD zákazníkov.

Funkcia DATESBETWEEN vráti tabuľku obsahujúcu stĺpec dátumov, ktorý sa začína daným počiatočným dátumom a pokračuje až do daného koncového dátumu. Keď má počiatočný dátum hodnotu BLANK (je prázdny), použije sa prvý dátum v stĺpci dátumov. (Naopak, keď má dátum ukončenia hodnotu BLANK, použije sa posledný dátum v stĺpci dátumov.) V tomto prípade je dátum ukončenia určený funkciou MAX, ktorá vráti posledný dátum v kontexte filtra. Preto, ak je mesiac august 2017 v kontexte filtra, funkcia MAX vráti dátum 31. august 2017 a DATESBETWEEN funkcia vráti všetky dátumy až do 31. augusta 2017.

Potom môžete upraviť mierku tak, že ju premenujete na Noví zákazníci a pridáte jej druhú premennú na uloženie počtu jednotlivých zákazníkov pred časovým obdobím v kontexte filtra. Klauzula RETURN teraz od ltd zákazníkov odčíta túto hodnotu, aby vytvorila výsledok, čo je počet nových zákazníkov v časovom období.

New Customers =
VAR CustomersLTD =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MAX('Date'[Date])
        ),
    'Sales Order'[Channel] = "Internet"
    )
VAR CustomersPrior =
    CALCULATE(
        DISTINCTCOUNT(Sales[CustomerKey]),
        DATESBETWEEN(
            'Date'[Date],
            BLANK(),
            MIN('Date'[Date]) - 1
        ),
        'Sales Order'[Channel] = "Internet"
    )
RETURN
    CustomersLTD - CustomersPrior

Obrázok zobrazuje vizuál matice so zoskupenými údajmi rokov a mesiacov v riadkoch a súhrnmi výnosov, výnosov YTD, výnosov YoY % a nových zákazníkov. Hodnoty nových zákazníkov sú zvýraznené.

V prípade premennej CustomersPrior si všimnite, že DATESBETWEEN funkcia obsahuje dátumy až do prvého dátumu v kontexte filtra mínus jeden. Keďže služba Microsoft Power BI interne ukladá dátumy ako čísla, môžete pripočítať alebo odčítať čísla, aby sa došlo k posunu dátumu.

Výpočty snímok

Príležitostne sa údaje faktov ukladajú ako snímky v čase. Medzi bežné príklady patria množstvá zásob inventára alebo zostatky na konte. Snímka hodnôt sa načíta do tabuľky na periodickej báze.

Pri vytváraní súhrnu hodnôt snímok (ako sú množstvá zásob inventára) môžete sumarizovať hodnoty v rámci ľubovoľnej dimenzie okrem dátumu. Zmysluplný súhrn vytvoríte vtedy, ak pridáte množstvo zásob v rámci jednotlivých kategórií produktov, no nie vtedy, ak pridáte množstvo zásob v rámci obdobia dátumov. Pridanie včerajšieho množstva zásob k dnešnému množstvu zásob nie je užitočnou operáciou (ibaže by ste chceli vypočítať ich priemer).

Pri vytváraní súhrnu tabuliek snímok sa vzorce mierky môžu oprieť o funkcie časovej inteligencie jazyka DAX, ktoré vynútia filter jedného dátumu.

V nasledujúcom príklade budete skúmať scenár pre spoločnosť Adventure Works. Prepnite na zobrazenie modelu a vyberte diagram modelu Inventár.

Obrázok znázorňuje diagram modelu, ktorý sa skladá z troch tabuliek: Produkt, dátum a inventár. Všetky tabuľky produktov a dátumov majú k tabuľke Inventár vzťah „one-to-many“.

Všimnite si, že diagram zobrazuje tri tabuľky: Produkt, Dátum a Inventár. V tabuľke Inventár sú uložené snímky zostatkov jednotiek pre každý dátum a produkt. Dôležité je, že tabuľka neobsahuje žiadne prázdne dátumy a žiadne duplicitné položky pre produkt v rovnakom dátume. Tiež treba spomenúť, že posledný záznam snímky je uložený pre dátum 15. júna 2020.

Teraz sa prepnite na zobrazenie zostavy a vyberte stranu 2 zostavy. Pridajte stĺpec UnitsBalance tabuľky Inventory do vizuálu matice. Jeho predvolená sumarizácia je nastavená na sčítanie hodnôt.

Obrázok znázorňuje vizuál matice s názvom FY2020 Mountain-200 Bike Stock. Má produkty zoskupené v riadkoch a mesiace v stĺpcoch. Pre každý produkt a mesiac sa zobrazujú vysoké hodnoty.

Táto konfigurácia vizuálu je príkladom toho, ako nesumarizovať hodnotu snímky. Pridávanie denných zostatkov snímok spolu nevypočíta zmysluplný výsledok. Odstráňte preto pole UnitsBalance z vizuálu matice.

Teraz pridáte do tabuľky Inventory mierku, ktorá sčíta hodnotu poľa UnitsBalancepre jeden dátum. Dátum bude posledným dátumom každého časového obdobia. Dosiahne sa použitím LASTDATE funkcie . Naformátujte mierku ako celé číslo pomocou oddeľovača tisícok.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTDATE('Date'[Date])
)

Poznámka

Všimnite si, že vzorec mierky SUM používa funkciu . Agregačnú funkciu je potrebné použiť (mierky nepovoľujú priame odkazy na stĺpce), ale vzhľadom na to, že pre každý produkt existuje iba jeden riadok, SUM bude funkcia fungovať iba v jednom riadku.

Do vizuálu matice pridajte mierku Množstvá zásob na sklade. Hodnota pre každý produkt je teraz založená na zostatku posledných zaznamenaných jednotiek pre každý mesiac.

Obrázok znázorňuje vizuál matice s názvom FY2020 Mountain-200 Bike Stock. Má produkty zoskupené v riadkoch a mesiace v stĺpcoch. Pre každý produkt a mesiac sa zobrazujú nižšie hodnoty. Polia Jún 2020 a Celkový súčet majú hodnotu BLANK.

Mierka vráti hodnoty BLANK pre jún 2020, pretože pre posledný dátum v júni neexistuje žiadny záznam. Podľa údajov sa tak ešte nestalo.

Filtrovanie podľa posledného dátumu v kontexte filtra má neodmysliteľné problémy: Dátum zaznamenania nemusí existovať, pretože ešte nenastal alebo pravdepodobne preto, že zostatky zásob sa nezaznamenávajú cez víkendy.

Ďalším krokom je úprava vzorca mierky s cieľom určiť posledný dátum, ktorý nemá prázdne pole výsledku, a potom filtrovať údaje podľa tohto dátumu. Túto úlohu môžete splniť pomocou LASTNONBLANK funkcie DAX.

Pomocou tejto definície mierky môžete upraviť mierku Množstvá zásob na sklade.

Stock on Hand =
CALCULATE(
    SUM(Inventory[UnitsBalance]),
    LASTNONBLANK(
        'Date'[Date],
        CALCULATE(SUM(Inventory[UnitsBalance]))
    )
)

Vo vizuáli matice si všimnite hodnoty pre jún 2020 a celkový súčet (predstavujúci celý rok).

Obrázok znázorňuje, že vizuál matice má teraz hodnoty pre jún 2020 a celkový súčet.

Táto LASTNONBLANK funkcia je iteračnou funkciou. Vráti posledný dátum, na základe ktorého sa vypočíta výsledok, ktorý nemá hodnotu BLANK. Tento výsledok dosiahnete zopakovaním všetkých dátumov v kontextovom filtri v zostupnom chronologickom poradí. (Naopak, FIRSTNONBLANK iteruje vo vzostupnom chronologickom poradí.) Pre každý dátum sa vyhodnotí odovzdaný výraz. Keď sa vyskytne výsledok, ktorý nie je prázdny, funkcia vráti dátum. Tento dátum sa potom použije na filtrovanie CALCULATE funkcie.

Poznámka

Funkcia LASTNONBLANK vyhodnotí svoj výraz v kontexte riadka. Funkcia CALCULATE sa musí použiť na prechod kontextu riadka na filtrovanie kontextu na správne vyhodnotenie výrazu.

Teraz by ste v tabuľke Inventár mali skryť stĺpec UnitsBalance. Zabránite tak tomu, aby autori zostáv nevhodne sumarizovali zostatky jednotiek snímok.