Power BI Window funkcije – 4. del
02.05.2024
Od prvotnega lansiranja window funkcij je Microsoft izdal že kar nekaj posodobitev aplikacije Power BI. Posodobitve so med drugim vsebovale manjše dodelave window funkcij, izšla pa je tudi kakšna nova. Ena od teh je predmet današnjega članka, imenuje pa se RANK.
Funkcija RANK
Morda se zdi čudno, da je Microsoft razvil dodatno funkcijo za rangiranje, ko pa v DAX-u že obstaja funkcija RANKX. Vendar ima RANKX določene pomanjkljivosti, ki jih lahko rešujem le z nekimi obvodi v omejitvah same funkcije. Vzemimo sledeči primer funkcije RANKX:
_ProductRankX =
RANKX(
ALLSELECTED(DimProduct),
[_TotalSales],
,
DESC,
Dense
)
Če damo funkcijo na vizualizacijo tabele, vred z DimProduct[ProductKey], DimProduct[EnglishProductName] ter mero _TotalSales, bomo hitro videli rezultat, ki nam verjetno ne bo všeč.
Na dnu vizualizacije je vsota vseh prodaj rangirana na prvem mestu. Glede na to, da smo želeli po prodajah rangirati posamične produkte, nam je spodnja številka le v napoto. Z window funkcijo RANK se tej težavi ognemo:
_ProductRankWindow =
RANK(
DENSE,
ALLSELECTED(DimProduct),
ORDERBY(
[_TotalSales],
DESC
)
)
RANKX bi nam povzročal preglavice tudi pri nekoliko kompleksnejših zahtevah. Če bi denimo želeli rangirati rezultate prodaj po mesecih znotraj posameznega leta, bi morda v ta namen uporabili vizualizacijo matrike, na katero bi pod vrstice umestili DimDate[CalendarYear] ter DimDate[EnglishMonthName], pod vrednosti pa mero _TotalSales. RANKX mero bi rabili nato nekoliko spremeniti:
_ProductRankX =
RANKX(
ALLSELECTED(
DimDate[MonthNumberOfYear],
DimDate[EnglishMonthName]
),
[_TotalSales],
,
DESC,
Dense
)
Pri pisanju tovrstne mere je potrebno dobro razumeti konteksta filtra. Vizualizacija filtrira glede na številko leta in ime meseca. A da so meseci sortirani v pravilnem vrstnem redu, je potrebno v nastavitvah modela uporabiti stolpec DimDate[MonthNumberOfYear], ki se posledično prav tako uporablja v kontekstu filtra. Filter na letu želimo obdržati, z ALLSELECTED zato odstranimo kontekst filtra na DimDate[MonthNumberOfYear] ter DimDate[EnglishMonthName]. Na sliki vidimo, da mera sicer deluje, a ravno tako zapisuje nepotrebna rangiranja, tako pri skupni vsoti spodaj, kot pri vsaki grupaciji po letih.
S funkcijo RANK lahko to estetsko težavo odpravimo:
_ProductRankWindow =
RANK(
DENSE,
ALLSELECTED(
DimDate[MonthNumberOfYear],
DimDate[EnglishMonthName]
),
ORDERBY(
[_TotalSales],
DESC
)
)
Seveda pa prednost funkcije RANK ni le v estetiki vizualizacije. Glavna prednost je enostavno večnivojsko sortiranje. Če bi želeli prodaje artiklov sortirati najprej po številu prodanih kosov, nato še po vsoti prodaj, bi lahko naredili nekaj takšnega:
_ProductRankWindow =
RANK(
DENSE,
ALLSELECTED(DimProduct),
ORDERBY(
[_TotalUnitsSold],
DESC,
[_TotalSales],
DESC
)
)
Klemen VončinaMicrosoft Office Specialist Master
predavatelj, MCT
klemen.voncina@kompas-xnet.si
predavatelj, MCT
klemen.voncina@kompas-xnet.si
Do you have any additional questions?
For more information, we are always happy to assist you. Feel free to contact us at info@kompas-xnet.si or call us at 01 5136 990.
Contact usNovice
Naročite se na Xnet novice in ostanite na tekočem glede novih tečajev, seminarjev, možnosti pridobitve novih certificiranj in akcijskih cen.