Power BI Window funkcije – 2. del
14.09.2023
Funkcija INDEX, s pomočjo katere lahko pridobimo podatke iz vrstice na neki absolutni poziciji.
![](https://kompasxnet2.blob.core.windows.net/article-image/gdifgjjbnieFege_blog-power-bi-window-funkcije-2-del.png)
V prejšnjem članku te serije smo, s pomočjo funkcije OFFSET, naredili izračunani stolpec za prikazovanje zalog prejšnjega dne. S pomočjo funkcije OFFSET lahko pridobivamo podatke iz neke druge vrstice, relativno glede na položaj vrstice v trenutnem kontekstu. V tem članku si bomo ogledali funkcijo INDEX, s pomočjo katere lahko pridobimo podatke iz vrstice na neki absolutni poziciji. V primerih bomo uporabljali AdventureWorksDW2019.
Funkcija INDEX
Kadar analiziramo podatke, pogosto želimo uporabljati najvišjo ali najnižjo vrednost iz nabora podatkov. V ta namen običajno uporabljamo funkciji MAX ter MIN. Za pridobitev najvišjega in najnižjega leta v naši datumski tabeli lahko uporabimo sledeči meri:
_LastYear =
MAX ( DimDate[CalendarYear] )
Ki vrne 2005.
_FirstYear =
MIN ( DimDate[CalendarYear] )
Ki vrne 2014.
Enak rezultat bi lahko dobili s pomočjo funkcije INDEX:
_FirstYearINDEX =
INDEX ( 1, ALLSELECTED ( DimDate[CalendarYear] ) )
Funkcija ALLSELECTED je tu uporabljena, da pridobimo seznam enoličnih let, vrednoten v določenem kontekstu filtra. Prvi argument, 1, pa funkciji pove, da želimo pridobiti prvi element iz tega seznama vrednosti. Rezultat funkcije INDEX je sicer tabela, ker pa je rezultat zgornje funkcije tabela z eno samo vrednostjo, lahko rezultat te mere uporabimo kot skalarno vrednost in jo prikažemo na vizualizaciji.
Zakaj pa bi nekaj, kar lahko rešimo z enostavno funkcijo MIN reševali s precej kompleksnejšo funkcijo INDEX. S funkcijo INDEX nismo omejeni le na podatke, ki so na prvem ali zadnjem mestu, pač pa lahko pridobimo tudi vrednosti, ki so na drugem, tretjem, predzadnjem mestu in tako naprej.
_SecondYearINDEX =
INDEX ( 2, ALLSELECTED ( DimDate[CalendarYear] ) )
Funkcija INDEX pa nam omogoča tudi precej kompleksnejše uvide v naše podatke. Denimo, da bi radi izračunali vsoto prodaj najbolj zapravljivim kupcem iz vsake države. Najprej si pripravimo mero, s katero lahko izračunamo vsoto prodaj:
_TotalSales =
SUMX (
FactInternetSales,
FactInternetSales[OrderQuantity] * FactInternetSales[UnitPrice]
)
Nato si moramo pripraviti funkcijo za tabelo, ki bo prikazovala vsoto prodaj glede na državo in kupca. V Power BI Desktopu lahko rezultate te funkcije vidimo tako, da jo uporabimo za ustvarjanje izračunane tabele.
_SalesByCountryAndCustomer =
SUMMARIZECOLUMNS (
DimSalesTerritory[SalesTerritoryCountry],
DimCustomer[CustomerKey],
"Sales", [_TotalSales]
)
Vidimo, da smo mero _TotalSales uporabili za stolpec Sales. Iz te tabele pa nas zanima le prodaja najbolj zapravljivemu kupcu iz vsake države. Če nas zanima ta vmesni rezultat, lahko funkcijo zopet uporabimo za izdelavo izračunane tabele:
_TopSpenderByCountry =
INDEX (
1,
SUMMARIZECOLUMNS (
DimSalesTerritory[SalesTerritoryCountry],
DimCustomer[CustomerKey],
"Sales", [_TotalSales]
),
ORDERBY ( [Sales], DESC ),
KEEP,
PARTITIONBY ( DimSalesTerritory[SalesTerritoryCountry] )
)
V funkciji INDEX zopet iščemo podatek, ki je na prvem mestu (1), pri tem pa se orientiramo po stolpcu Sales, ki ga razvrstimo padajoče (ORDERBY ( [Sales], DESC )). Ta funkcija pa nam ne bo vrnila le ene vrstice, pač pa eno vrstico za vsako državo, saj smo definirali iskanje najbolj zapravljivega kupca znotraj particij, izdelanih na podlagi držav (PARTITIONBY ( DimSalesTerritory[SalesTerritoryCountry] )).
Ko imamo tabelo, ki vsebuje podatke o prodajah najbolj zapravljivim kupcem, je naša naloga le še, da se po njej sprehodimo in seštejemo podatke v stolpcu Sales. To lahko storimo s preprosto SUMX funkcijo:
_SalesToTopCustomers =
SUMX (
INDEX (
1,
SUMMARIZECOLUMNS (
DimSalesTerritory[SalesTerritoryCountry],
DimCustomer[CustomerKey],
"Sales", [_TotalSales]
),
ORDERBY ( [Sales], DESC ),
KEEP,
PARTITIONBY ( DimSalesTerritory[SalesTerritoryCountry] )
),
[Sales]
)
KLEMEN VONČINA, MCT, Microsoft Office Specialist Master
Kontakt: klemen.voncina@kompas-xnet.si