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čina
Microsoft Office Specialist Master
predavatelj, MCT
klemen.voncina@kompas-xnet.si

Imate dodatna vprašanja?

Za več informacij smo vam vedno z veseljem na voljo. Pišite nam na info@kompas-xnet.si ali nas pokličite 01 5136 990.

Kontaktirajte nas

Novice

Naročite se na Xnet novice in ostanite na tekočem glede novih tečajev, seminarjev, možnosti pridobitve novih certificiranj in akcijskih cen.

Še niste naročeni na naše novice?

Naročite se na Xnet novice in ostanite na tekočem glede novih tečajev, seminarjev, možnosti pridobitve novih certificiranj in akcijskih cen.

Potrebuješ pomoč? bot icon
Potrebuješ pomoč?