Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

V tomto návode sa pozrieme na časť kódu DAX. Možno ste už niečo také použili. Alebo naň môžete naraziť a byť zmätení z toho, ako tento kód funguje a ako sa zdá, že kontext riadkov a kontext filtra vzájomne interagujú v jedinom kóde DAX. Či tak alebo onak, tento tutoriál sa podrobne pozrie na všetky vyššie uvedené. Celé video tohto návodu si môžete pozrieť v spodnej časti tohto blogu.

Najprv sa pozrieme na samotný kód. Potom si prejdeme teoretickú časť, aby sme jej lepšie porozumeli. Nakoniec sa pozrieme na všetko zákulisie používania.

Dátový model, ktorý budeme používať, je v podstate jednoduchý predajný dátový model, ktorý obsahuje Dátumy, Predaj a tabuľku Produkty. Tabuľka Predaj obsahuje transakcie pre každý daný deň. Tabuľka Produkty obsahuje informácie o predaji produktov v každý daný deň. Tabuľka Dátumy obsahuje len niekoľko stĺpcov na účely tohto návodu.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Zaujíma nás iba tabuľka Dátumy, ale na vysvetlenie, ako sa kontext filtra a kontext riadkov šíri pomocou vzťahov, použijeme tabuľky Predaj a Produkty.

Obsah

Kontext riadku a kontext filtra v bežiacom meraní súčtu

Teraz vytvorte priebežnú celkovú mieru, pretože obsahuje kontexty riadkov aj filtrov. Toto je základná miera súčtu, kde používam COUNTROWS cez FILTER a funkciu ALL na vrátenie všetkých rokov, ktoré mám v tabuľke Dátum. Keď toto opatrenie uvediem do tabuľky nižšie, môžete vidieť, že sme dosiahli výsledok, ktorý očakávame.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Teraz sa pokúsme analyzovať, ako tento kód DAX funguje.

Ako prvé môžete vidieť, že máme COUNTROWS, ale to nie je prvá funkcia, ktorá sa hodnotí alebo vykonáva. Potom máme funkciu FILTER a potom VŠETKO. Prvá vec v poradí hodnotenia je zo VŠETKÝCH. ALL vráti všetky jedinečné hodnoty dátumu kalendárneho roka čísla ignorovaním akéhokoľvek kontextu filtra, ktorý existuje mimo funkcie ALL.

Takže v metrikách máme stĺpec Číslo kalendárneho roka a tento stĺpec aktívne filtruje. Ale keďže VŠETKO bude ignorovať existujúci kontext filtra, získame všetky jedinečné hodnoty tohto stĺpca.

V druhom argumente, v kontexte riadku, sme napísali, že počet kalendárnych rokov kalendára by mal byť menší ako počet kalendárnych rokov MAX dátumov. Ak ste začiatočník a stále sa snažíte porozumieť jazyku DAX a naučiť sa ho, možno si myslíte, že odkazy na ľavej strane a vo vnútri funkcie MAX patria do rovnakého stĺpca a sú tou istou tabuľkou, ktorú máme vo vnútri Funkcia VŠETKY.

Ale to nie je pravda. Jediná časť kontextu riadku, ktorá patrí do funkcie ALL, je tá, ktorú máme na ľavej strane. Ten, ktorý máme na MAX, sa vyhodnocuje v kontexte filtra a nie v kontexte riadku.

FILTER sa teda pokúsi vytvoriť kontext riadka v tabuľke, ktorú zadáte v prvom argumente, a táto časť kódu sa v skutočnosti získa z konkrétneho kontextu riadka. Takže každý riadok FILTER iteruje tabuľku, ktorú máme vo VŠETKÝCH, a potom máme prístup ku všetkým hodnotám, ktoré práve iterujeme.

Takže v prvej iterácii máme iba jednu hodnotu. V druhej iterácii máme druhú hodnotu. Ale keď píšeme MAX, je to nezávislé od kontextu riadku, ktorý vytvárame pomocou funkcie FILTER. Takže MAX sa vyhodnocuje v kontexte filtra, ktorý sa vytvára podľa čísla aktuálneho roku, ktoré sme použili v tejto matici.

Keď sme v roku 2006, MAX vráti 2006, zatiaľ čo aktuálny riadok môže byť 2006, 2007 alebo 2008. FILTER vráti tabuľku, ktorá spĺňa kritériá, ktoré špecifikujeme v druhom argumente. Keď sa presunieme do roku 2007, MAX sa vráti 2007. V roku 2008 sa vráti 2008. A v závislosti od všetkých hodnôt, ktoré sú menšie ako hodnota, ktorú vracia funkcia MAX, FILTER vráti a tabuľky.

Aby sme dokázali, že MAX nezávisí od kontextu riadka, môžeme tento kúsok kódu DAX rozdeliť do niekoľkých premenných. A potom budeme schopní pochopiť, že odkaz na stĺpec na ľavej strane a na pravej strane nie je rovnaký.

Poďme teda vytvoriť premennú.

Ako môžete vidieť na meraní nižšie, vytvoril som tri premenné (). Nakoniec som pridal kód FILTER s premennou Result, ktorú používa. Keď použijem toto opatrenie v tabuľke nižšie, uvidíte, že sa nič nemení. Výsledky sú stále rovnaké. Stále máme rovnaký priebežný súčet, aký sme dostávali skôr.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Ak sa vrátime ku kódu a pokúsime sa získať hodnotu prvej premennej a potvrdiť to, môžete vidieť, že pre každý riadok dostaneme rovnaký rok.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Dúfajme, že som vám dokázal vysvetliť, že funkcia MAX v tomto konkrétnom kóde v skutočnosti nezávisí od skutočného kontextu pre jej hodnoty. A ak chcete zjednodušiť pochopenie kontextu vyhodnocovania, vždy môžete kód rozdeliť na niekoľko premenných, aby ste pochopili poradie hodnotenia a spôsob, akým sa kód vykonáva.

Teraz vám chcem ukázať scenár, v ktorom bude funkcia MAX závisieť od kontextu riadku , ktorý vytvorí funkcia FILTER.

Vráťme sa teda k tomu meraniu. Zopakujme to a namiesto Last Visible Year budem maťMAX dátumov Číslo kalendárneho roka. Keď to dám do matrice, môžete vidieť, že máme prázdne miesto.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

prečo?

Ide o to, že iterujeme všetky roky a CALCULATE robí to, že konvertuje aktuálne iterovaný riadok na ekvivalentný kontext filtra.

Ak sem napíšem znamienko rovnosti, môžete vidieť, že dostaneme sedem, sedem a sedem.

prečo?

Dovoľte mi vytvoriť novú vypočítanú tabuľku, aby ste mohli ľahko pochopiť, čo sa deje.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Idem vytvoriť nový stôl. Ďalej idem písaťcez VŠETKY dátumy číslo kalendárneho roka. Potom napíšem Max Year a potom použijem CALCULATE cez MAX z Date Calendar Year Number. A teraz môžete vidieť, že pre každý riadok opakujeme rovnakú hodnotu.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Keďže tieto čísla nie sú striktne nižšie ako oni sami, dostávame prázdne miesto. Ale keď použijeme rovné (=), hovoríme, že všetky hodnoty, ktoré sú menšie ako 2011, dostanú sedmičku.

Navyše, aj keď používate referenciu na meranie, napríklad niečo ako Max Year, tento kód nebude fungovať.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Ak kliknem na potvrdenie, môžete vidieť, že stále nič nedostaneme. Je to preto, že keď píšeme Max Year, píšeme jednoducho CALCULATE MAX Dates Calendar Year Number.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Referencia miery má vždy mimo nej CALCULATE. Toto opatrenie teda spúšťa kontextový prechod, ktorý konvertuje aktuálne iterovaný riadok na kontext filtra.

Ak ste však viazaní a musíte použiť referenciu na mieru, môžete túto mieru uložiť do premennej. A ako možno viete, premenné sú konštantné a nemôžu vytvoriť kontextový prechod. Takže nemôže konvertovať kontext riadka na kontext filtra.

Toto je teda rýchla ukážka toho, ako kontext riadka a kontext filtra vzájomne interagujú v kóde DAX.

Teraz poďme do DAX Studio, aby sme pochopili, čo sa deje v zákulisí.

Používanie DAX Studio na pochopenie kontextu riadkov a filtrovania

Poďme do Externých nástrojov a spustíme DAX Studio. Potrebujeme sa pripojiť k súboru LuckyTemplates pomocou Query Plan a Server Timings .

Potom vytvorím mieru dotazu. Do tabuľky Dátumy napíšem DEFINOVAŤ OPATRENIE, Priebežný súčet. A potom použijem pôvodný kód, ktorý sme mali.

Keďže máme vrátiť tabuľku, môžeme napísať HODNOTIŤ. Nakoniec vytvoríme tabuľku pomocou SUMMARIZECOLUMNS. Takže napíšeme Dátumy, Číslo kalendárneho roka a virtuálny stĺpec, ktorý bude Priebežný súčet. A potom môžem napísať niečo ako DT ako kľúčové slovo DAX Studio.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Ak spustím tento kód, môžete vidieť, že kód je dokončený a stále dostaneme rovnaký výsledok, aký sme videli v LuckyTemplates.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Teraz poďme do Plánu dopytov, aby sme pochopili, čo sa deje v zákulisí. Pozrime sa, či je funkcia MAX skutočne závislá od kontextu riadka alebo nie. Poďme k logickému plánu dopytov, pretože fyzický plán dopytov je vo všeobecnosti zložitejší a je trochu ťažko čitateľný.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Môžete vidieť, že prvý operátor na prvom riadku je GroupSemiJoin a používa ho SUMMARIZECOLUMNS na vytvorenie vnútorného spojenia medzi dvoma stĺpcami.

Potom na spojenie týchto stĺpcov existuje Scan_Vertipaq , čo je ukladací mechanizmus, ktorý máme v rámci analytických služieb. Vidíme, že to hovorí, že potrebujeme stĺpec, ktorý je Dates Calendar Year Number. V LuckyTemplates môžete vidieť, že na matici máme tento stĺpec Číslo kalendárneho roka, ktorý slúži ako prístup k našej správe.

Ďalej máme funkciu COUNTROWS v našom meraní ako operátor najvyššej úrovne, potom COUNTROWS volápre filter. Opäť je tu Scan_Vertipaq , ktorý hovorí, že RequiredCols je Dates Calendar Year Number.

Riadky 2 a 5 sú rovnaké, ale prvý Scan_Vertipaq je označený nulou, zatiaľ čo druhý je označený jednotkou. To znamená, že stĺpec, ku ktorému pristupujeme pomocou funkcie ALL, je extrahovaný oddelene od stĺpca, ktorý máme vo funkcii SUMMARIZECOLUMNS.

Potom je tu operátor LessThan . V ďalšom riadku vidíme, že existuje porovnanie medzi kontextom riadku a funkciou MAX .

Nasleduje Max_Vertipaq . Takže v skutočnosti extrahujeme maximálnu hodnotu z ukladacieho mechanizmu. Smerom doprava môžete vidieť, že sa tam píše DependOnCols Dates Calendar Year Number. Toto je najdôležitejšia vec, ktorú si musíme zapamätať. Predtým som povedal, že neexistuje žiadna závislosť funkcie MAX od kontextu riadku, a to je to, čo to vlastne dokazuje.

A tak sa tu píše nula.

Kde sme našli nulu?

Na vrchu (druhý riadok), ktorý sa získava pre SÚHRNNÉ ŠTÁTKY. To znamená, že funkcia MAX nezávisí od kontextu riadku, ale v skutočnosti závisí od stĺpca (Číslo kalendárneho roka), ktorý máme v tabuľke. Takže táto tabuľka v skutočnosti vytvára kontext filtra.

Stručne povedané, funkcia MAX závisí od kontextu filtra a nie od kontextu riadka.

Ďalej môžete vidieť, že na výpočet Max_Vertipaq máme Scan_Vertipaq , ktorý hovorí, že DependOnCols nula (0) Dátum kalendárneho roka číslo. A potom existuje niekoľko ďalších stĺpcov, ktoré vyžadujú stĺpce.

Teraz sa pozrime na variabilnú verziu kódu. Namiesto vrátenia LastVisibleYear vrátim verziu COUNTROWS alebo premennú Result a môžete vidieť, že stále dostávame rovnaký výsledok.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Ak sa pozrieme na plán dopytov, môžete vidieť, že je o niečo dlhší, ale o to ľahšie sa číta.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

Nakoniec je tu aj vypočítaná verzia kódu

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates

A takto vyzerá plán logického dotazovania.

Kontext riadkov a kontext filtra v kóde DAX LuckyTemplates




Záver

V tomto návode som vysvetlil, ako môže daná funkcia interagovať a ako nemôže interagovať s kontextom riadku. Tiež som vám ukázal, ako bol MAX v tomto prípade vyhodnotený v kontexte filtra a nie v kontexte riadku.

Je dôležité si vždy zapamätať, že kontext filtra filtruje celý model a kontext riadka iba iteruje danú tabuľku a nikdy nefiltruje model. Kontext filtra neopakuje tabuľku.

Dúfam, že vám tento návod pomohol. Zostaňte naladení na našekód, ktorý čoskoro zverejníme. Do podobných scenárov pôjdeme oveľa hlbšie. Tiež vás naučíme, ako môžete optimalizovať svoj kód DAX.


Scatter Plot In R Script: Jak vytvořit a importovat

Scatter Plot In R Script: Jak vytvořit a importovat

V tomto tutoriálu se naučíte, jak vytvořit vizualizaci R bodového grafu v LuckyTemplates pomocí vizuálu R Script.

Zvýšte úroveň ponuky externých nástrojov v LuckyTemplates

Zvýšte úroveň ponuky externých nástrojov v LuckyTemplates

Spoznajte najlepšie externé nástroje v LuckyTemplates a naučte sa, ako ich nainštalovať na plochu LuckyTemplates. Poskytujú vašim prehľadom viac možností.

Vytvořte rychlé měření v LuckyTemplates s Quick Measures Pro

Vytvořte rychlé měření v LuckyTemplates s Quick Measures Pro

V tomto blogu se naučíme a procvičíme si používání Quick Measures Pro, nepostradatelného externího nástroje při provádění rychlých měření v LuckyTemplates.

Zobrazte dátum/čas posledného obnovenia v prehľadoch LuckyTemplates

Zobrazte dátum/čas posledného obnovenia v prehľadoch LuckyTemplates

Zistite, ako nájsť presný dátum posledného obnovenia prehľadu LuckyTemplates. Všetko, čo musíte urobiť, je použiť M kód a pokročilý editor.

Dynamické filtrovanie finančného roka v správach LuckyTemplates

Dynamické filtrovanie finančného roka v správach LuckyTemplates

V tomto návode Ill diskutujeme o tom, ako môžete efektívne filtrovať viacero údajov cez finančný rok v rámci prehľadov LuckyTemplates.

Príručka a ovládanie jazyka Power Query M

Príručka a ovládanie jazyka Power Query M

Tento tutoriál bude diskutovať o tom, ako úspešne implementovať jazyk M a vyriešiť bežné chyby v editore Power Query.

Sloupec indexu Pandas Drop: Vysvětleno s příklady

Sloupec indexu Pandas Drop: Vysvětleno s příklady

Sloupec indexu Pandas Drop: Vysvětleno s příklady

7 způsobů, jak zkontrolovat, zda řetězec Pythonu obsahuje podřetězec

7 způsobů, jak zkontrolovat, zda řetězec Pythonu obsahuje podřetězec

7 způsobů, jak zkontrolovat, zda řetězec Pythonu obsahuje podřetězec

Prehľad dynamického obsahu Power Automate

Prehľad dynamického obsahu Power Automate

Pochopte, čo je dynamický obsah Power Automate a ako umožňuje používateľom vyberať odkazy na polia z predchádzajúcich krokov alebo zapisovať výrazy.

Změna umístění souboru pomocí parametru dotazu v LuckyTemplates

Změna umístění souboru pomocí parametru dotazu v LuckyTemplates

V tomto tutoriálu se naučíte, jak sdílet soubor s osobou, která není součástí vaší společnosti, pomocí parametru dotazu sql v LuckyTemplates.