Context de rând și context de filtrare într-un cod LuckyTemplates DAX

În acest tutorial, vom arunca o privire la o bucată de cod DAX. Este posibil să fi folosit deja așa ceva. Sau, s-ar putea să dai peste el și să fii confuz cu privire la modul în care funcționează acest cod și la modul în care atât Contextul rândurilor, cât și Contextul filtrului par să interacționeze unul cu celălalt într-un singur cod DAX. Oricum, acest tutorial va analiza toate cele de mai sus în detaliu. Puteți viziona videoclipul complet al acestui tutorial în partea de jos a acestui blog.

În primul rând, ne vom uita la codul în sine. Apoi vom trece peste partea de teorie pentru a o înțelege mai bine. În cele din urmă, ne vom uita la tot ce se află în spatele scenei utilizând DAX Studio .

Modelul de date pe care îl vom folosi este practic un model simplu de date de vânzări care conține Date, Vânzări și tabelul Produse. Tabelul Vânzări conține tranzacții pentru fiecare zi dată. Tabelul Produse conține informații despre informațiile despre vânzări despre produse în fiecare zi dată. Tabelul Date conține doar câteva coloane în scopul acestui tutorial.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Ne interesează doar tabelul Date, dar vom folosi tabelul Vânzări și tabelul Produse pentru a explica cum se propagă contextul de filtru și contextul rândului cu ajutorul relațiilor.

Cuprins

Context de rând și context de filtrare într-o măsură totală în curs

Acum, să creăm o măsură totală rulantă, deoarece conține atât contexte de rând, cât și de filtre. Aceasta este o măsură totală de bază, în care folosesc COUNTROWS peste FILTER și funcția ALL pentru a returna toți anii pe care îi am în tabelul Date. Când aduc măsura respectivă în tabelul de mai jos, puteți vedea că obținem rezultatul pe care îl așteptăm.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Acum să încercăm să analizăm cum funcționează acel cod DAX.

În măsură, puteți vedea că mai întâi avem COUNTROWS, dar aceasta nu este prima funcție care este evaluată sau executată. Apoi, avem funcția FILTER și apoi ALL. Primul lucru din ordinea de evaluare este al TOATE. ALL returnează toate valorile unice ale Datelor Calendar Year Number ignorând orice context de filtru care există în afara funcției ALL.

Deci, în valori, avem coloana Numărul anului calendaristic și filtrează în mod activ acea coloană. Dar, deoarece ALL va ignora contextul de filtru existent, vom obține toate valorile unice ale acelei coloane.

În al doilea argument, în contextul rândului, am scris că Numărul anului calendaristic al Datelor ar trebui să fie mai mic decât numărul anului calendaristic MAX Date. Acum, dacă sunteți începător și încă încercați să înțelegeți și să învățați DAX, ați putea crede că atât referințele din partea stângă, cât și din interiorul funcției MAX aparțin aceleiași coloane și sunt același tabel pe care îl avem în interiorul Funcția ALL.

Dar asta nu este adevărat. Singura parte a contextului de rând care aparține funcției ALL este cea pe care o avem în partea stângă. Cel pe care îl avem pe MAX este evaluat într-un context de filtru și nu în contextul de rând.

Deci, FILTER încearcă să creeze un context de rând pe tabelul pe care îl furnizați în primul argument, iar această parte a codului este de fapt preluată din acel context de rând special. Deci, pe fiecare rând, FILTER repetă tabelul pe care îl avem în ALL și apoi putem accesa toate valorile pe care le repetăm ​​în prezent.

Deci, în prima iterație, avem o singură valoare. În a doua iterație, avem a doua valoare. Dar când scriem MAX, acesta este independent de contextul de rând pe care îl creăm folosind funcția FILTER. Deci MAX este evaluat în contextul de filtru care este creat de numărul anului curent pe care l-am folosit în acea matrice.

Când suntem la 2006, MAX va returna 2006, în timp ce rândul curent poate fi 2006, 2007 sau 2008. FILTER va returna tabelul care îndeplinește criteriile pe care le specificăm în al doilea argument. Când trecem la 2007, MAX va returna 2007. În 2008, va returna 2008. Și în funcție de toate valorile care sunt mai mici decât valoarea returnată de funcția MAX, FILTER va returna un masa.

Pentru a demonstra că MAX nu depinde de contextul rândului, putem segrega această bucată de cod DAX în mai multe variabile. Și apoi, vom putea înțelege că referința coloanei din partea stângă și cea din dreapta nu sunt aceleași.

Deci, să creăm o variabilă.

După cum puteți vedea în măsura de mai jos, am creat trei variabile ( ). Apoi am adăugat codul FILTER în sfârșit cu o variabilă Result care folosește COUNTROWS . Când folosesc această măsură în tabelul de mai jos, veți vedea că nimic nu se schimbă. Rezultatele sunt în continuare aceleași. Încă obținem același total curent pe care îl obțineam mai devreme.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Dacă ne întoarcem la cod și încercăm să recuperăm valoarea primei variabile și să confirmăm asta, puteți vedea că pentru fiecare rând, obținem același an.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Deci, sper că am putut să vă explic că funcția MAX, în acest cod special, nu depinde de fapt de contextul real pentru valorile sale. Și dacă doriți să vă simplificați înțelegerea contextului de evaluare, puteți oricând să împărțiți codul în mai multe variabile, astfel încât să puteți înțelege ordinea evaluării și cum este executat codul.

Acum, vreau să vă arăt un scenariu în care funcția MAX va depinde de contextul de rând care este creat de funcția FILTER.

Deci, să revenim la această măsură. Să duplicăm asta și, în loc de Ultimul an vizibil, voi avea MAX Dates Calendar Year Number. Când aduc asta în matrice, puteți vedea că obținem un gol.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

De ce?

Chestia este că repetăm ​​toți anii și ceea ce face CALCULATE este că transformă rândul repetat în prezent într-un context de filtru echivalent.

Dacă scriu un semn egal aici, puteți vedea că obținem șapte, șapte și șapte.

De ce?

Permiteți-mi să creez un nou tabel calculat, astfel încât să puteți înțelege cu ușurință ce se întâmplă.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Mă duc să creez un nou tabel. În continuare, voi scrie peste ALL Datele Calendar Year Number. Apoi, voi scrie Anul maxim, iar apoi voi folosi CALCULATE peste MAX din Numărul anului calendaristic al Datelor. Și acum puteți vedea că pentru fiecare rând, repetăm ​​aceeași valoare.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Deoarece aceste numere nu sunt strict mai mici decât ele însele, primim un gol. Dar când folosim egal cu (=), spunem că toate valorile care sunt mai mici decât 2011 primesc un șapte.

În plus, chiar dacă utilizați o referință de măsură, cum ar fi ceva de genul Anul maxim, acest cod nu va funcționa.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Dacă dau clic pe confirmare, puteți vedea că încă nu primim nimic. Acest lucru se datorează faptului că atunci când scriem Anul maxim, scriem pur și simplu CALCULATE MAX Date Calendar Year Number.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

O referință de măsură are întotdeauna un CALCULATE în afara ei. Deci, această măsură inițiază o tranziție de context care convertește rândul repetat în prezent într-un context de filtru.

Dar dacă sunteți legat și trebuie să utilizați o referință de măsură, ceea ce puteți face este să stocați acea măsură într-o variabilă. Și după cum probabil știți, variabilele sunt constante și nu pot crea o tranziție de context. Deci nu poate converti contextul rândului într-un context de filtru.

Deci, aceasta este o demonstrație rapidă a modului în care un context de rând și un context de filtru interacționează unul cu celălalt într-un cod DAX.

Acum să mergem la DAX Studio pentru a înțelege ce se întâmplă în culise.

Utilizarea DAX Studio pentru a înțelege contextul rândurilor și contextul de filtrare

Să mergem la Instrumente externe și să lansăm DAX Studio. Trebuie să ne conectăm la fișierul LuckyTemplates cu ajutorul Planului de interogări și a Timingurilor serverului .

Apoi, voi crea o măsură de interogare. Voi scrie DEFINE MEASURE în tabelul Date, Date Running Total. Și apoi, voi folosi codul original pe care îl aveam.

Deoarece ar trebui să returnăm un tabel, putem scrie EVALUARE. În cele din urmă, vom crea tabelul folosind SUMMARIZECOLUMNS. Deci, vom scrie Date Calendar Year Number și coloana virtuală, care va fi totalul curent. Și apoi, pot scrie ceva de genul DT ca cuvânt cheie DAX Studio.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Dacă execut acest cod, puteți vedea că codul este complet și obținem în continuare același rezultat pe care l-am văzut în LuckyTemplates.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Acum, să mergem la Planul de interogare pentru a înțelege ce se întâmplă în culise. Să vedem dacă funcția MAX este de fapt dependentă de contextul rândului sau nu. Să trecem la Planul de interogare logic, deoarece Planul de interogare fizic este în general mai complex și este puțin greu de citit.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Puteți vedea că primul operator de pe prima linie este GroupSemiJoin și care este folosit de SUMMARIZECOLUMNS pentru a crea o îmbinare interioară între două coloane.

Apoi, pentru alăturarea acelor coloane, există Scan_Vertipaq , care este motorul de stocare pe care îl avem în cadrul serviciilor de analiză. Putem vedea că scrie că avem nevoie de o coloană, care este Date Calendar Year Number. În LuckyTemplates, puteți vedea că pe matrice avem această coloană Numărul anului calendaristic, care acționează ca acces la raportul nostru.

În continuare, avem funcția COUNTROWS în măsura noastră ca operator de nivel superior, apoi COUNTROWS apelează funcția FILTER pentru filtru. Există din nou un Scan_Vertipaq , care spune că RequiredCols este Date Calendar Year Number.

Liniile 2 și 5 sunt aceleași, dar primul Scan_Vertipaq este marcat cu zero, în timp ce al doilea este cu unu. Asta înseamnă că coloana pe care o accesăm, cu ajutorul funcției ALL, este extrasă separat de coloana pe care o avem în interiorul funcției SUMMARIZECOLUMNS.

Apoi, există un operator LessThan . În rândul următor, putem vedea că există o comparație între contextul rândului și funcția MAX .

Acesta este urmat de Max_Vertipaq . Deci, extragem de fapt valoarea Max din motorul de stocare. Spre dreapta, puteți vedea că scrie DependOnCols Date Calendar Year Number. Acesta este cel mai important lucru pe care trebuie să-l amintim. Mai devreme, am spus că nu există nicio dependență a funcției MAX de contextul rândului și asta demonstrează de fapt acest lucru.

Și așa, aici scrie zero.

Unde am gasit zero?

În partea de sus (a doua linie), care este extrasă pentru SUMMARIZECOLUMNS. Aceasta înseamnă că funcția MAX nu depinde de contextul rândului, ci de fapt depinde de coloana (Numărul anului calendaristic) pe care o avem în interiorul acelui tabel. Deci, acel tabel creează de fapt contextul de filtru.

Pe scurt, funcția MAX depinde de contextul filtrului și nu de contextul rândului.

În continuare, puteți vedea că pentru calcularea Max_Vertipaq, avem un Scan_Vertipaq , care spune că DependOnCols zero (0) Data Calendar Year Number. Și apoi, există câteva alte coloane care necesită coloane.

Acum să ne uităm la versiunea variabilă a codului. În loc să returnez LastVisibleYear, voi returna versiunea COUNTROWS sau variabila Rezultat și puteți vedea că obținem în continuare același rezultat.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Dacă ne uităm la Planul de interogări, puteți vedea că este puțin mai lung, dar este mult mai ușor de citit.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

În cele din urmă, iată și versiunea calculată a codului

Context de rând și context de filtrare într-un cod LuckyTemplates DAX

Și așa arată Planul său de interogare logic.

Context de rând și context de filtrare într-un cod LuckyTemplates DAX


DAX LuckyTemplates: Ce este contextul de rând
Introducere în contextul de filtrare în LuckyTemplates
Ce este tranziția contextului și de ce contează?

Concluzie

În acest tutorial, am explicat cum o anumită funcție poate interacționa și nu poate interacționa cu contextul rândului. De asemenea, v-am arătat cum MAX, în acest caz, a fost evaluat în contextul filtrului și nu în contextul rândurilor.

Este important să ne amintim întotdeauna că contextul de filtrare filtrează întregul model, iar contextul de rând iterează doar tabelul dat și nu filtrează niciodată modelul. Contextul filtrului nu repetă un tabel.

Sper că ați găsit acest tutorial de ajutor. Rămâneți la curent cu codul nostru DAX Studio pe care îl vom lansa foarte curând. Vom aprofunda mult mai mult în scenarii similare. De asemenea, vă vom învăța cum vă puteți optimiza codul DAX.

Leave a Comment

Ce este Sinele în Python: Exemple din lumea reală

Ce este Sinele în Python: Exemple din lumea reală

Ce este Sinele în Python: Exemple din lumea reală

Cum să salvați și să încărcați un fișier RDS în R

Cum să salvați și să încărcați un fișier RDS în R

Veți învăța cum să salvați și să încărcați obiecte dintr-un fișier .rds în R. Acest blog va trata, de asemenea, cum să importați obiecte din R în LuckyTemplates.

Primele N zile lucrătoare revizuite – O soluție de limbaj de codare DAX

Primele N zile lucrătoare revizuite – O soluție de limbaj de codare DAX

În acest tutorial despre limbajul de codare DAX, aflați cum să utilizați funcția GENERATE și cum să schimbați în mod dinamic titlul unei măsuri.

Prezentați perspective utilizând tehnica vizuală dinamică cu mai multe fire în LuckyTemplates

Prezentați perspective utilizând tehnica vizuală dinamică cu mai multe fire în LuckyTemplates

Acest tutorial va acoperi cum să utilizați tehnica Multi Threaded Dynamic Visuals pentru a crea informații din vizualizările dinamice de date din rapoartele dvs.

Introducere la filtrarea contextului în LuckyTemplates

Introducere la filtrarea contextului în LuckyTemplates

În acest articol, voi trece prin contextul filtrului. Contextul de filtrare este unul dintre subiectele majore despre care orice utilizator LuckyTemplates ar trebui să învețe inițial.

Cele mai bune sfaturi pentru utilizarea aplicațiilor din serviciul online LuckyTemplates

Cele mai bune sfaturi pentru utilizarea aplicațiilor din serviciul online LuckyTemplates

Vreau să arăt cum serviciul online LuckyTemplates Apps poate ajuta la gestionarea diferitelor rapoarte și informații generate din diverse surse.

Analizați modificările marjei de profit ore suplimentare – Analytics cu LuckyTemplates și DAX

Analizați modificările marjei de profit ore suplimentare – Analytics cu LuckyTemplates și DAX

Aflați cum să vă calculați modificările marjei de profit folosind tehnici precum măsurarea ramificării și combinarea formulelor DAX în LuckyTemplates.

Idei de materializare pentru cache-urile de date în DAX Studio

Idei de materializare pentru cache-urile de date în DAX Studio

Acest tutorial va discuta despre ideile de materializare a cache-urilor de date și despre modul în care acestea afectează performanța DAX-ului în furnizarea de rezultate.

Raportare de afaceri folosind LuckyTemplates

Raportare de afaceri folosind LuckyTemplates

Dacă încă utilizați Excel până acum, atunci acesta este cel mai bun moment pentru a începe să utilizați LuckyTemplates pentru nevoile dvs. de raportare a afacerii.

Ce este LuckyTemplates Gateway? Tot ce trebuie să știți

Ce este LuckyTemplates Gateway? Tot ce trebuie să știți

Ce este LuckyTemplates Gateway? Tot ce trebuie să știți