在Power BI中如果想對數(shù)據(jù)排序,可以使用DAX中的RANKX函數(shù),格式如下:
RANKX(<table>, <expression>[, <value>[, <order>[, <ties>]]])
1
主要參數(shù):
<table>:定義需要進(jìn)行排序的表單,可以是導(dǎo)入的原始表單,也可以是由DAX函數(shù)計(jì)算后生成的表單。
<expression>:定義排序依據(jù)的表達(dá)式,該表達(dá)式必須能返回單一標(biāo)量結(jié)果并且表達(dá)式中的參數(shù)列需要來自之前定義的table中;之后RANKX函數(shù)會根據(jù)這個(gè)表達(dá)式的計(jì)算結(jié)果進(jìn)行排序
RANKX函數(shù)的定義看起來很簡單,但是使用時(shí)有很多注意事項(xiàng),稍有不慎容易出錯(cuò)。例如以下面這個(gè)產(chǎn)品銷售表為例,用RANKX函數(shù)按銷售量對產(chǎn)品進(jìn)行排序。

先用最簡單的思路套用公式,創(chuàng)建一個(gè)Measure進(jìn)行排序,公式如下:
SalesRank = RANKX(Sales,SUM(Sales[Sales]),,DESC)
1
然而,用這個(gè)SalesRank結(jié)果在Report頁面得到的排序表單卻有問題, 所有產(chǎn)品的序號都等于1,明顯排序結(jié)果有誤。

出現(xiàn)該問題的原因有兩點(diǎn):首先,由于使用了Measure,其特點(diǎn)是會根據(jù)創(chuàng)建表單所使用的列動態(tài)獲取計(jì)算結(jié)果。Measure的計(jì)算結(jié)果會受到篩選上下文影響。由于沒有使用ALL函數(shù),導(dǎo)致RANKX函數(shù)中使用的參數(shù)表單Sales,會根據(jù)篩選條件Product和SUM[Sales]的變化而變化,相當(dāng)于每一行數(shù)據(jù)都在跟自己做排序,因此結(jié)果有誤。
其次,由于RANKX中的Expression部分沒有使用CALCULATE函數(shù)將行上下文轉(zhuǎn)換成篩選上下文,導(dǎo)致SUM(Sales[Sales])的計(jì)算不受篩選條件影響,變成了對整個(gè)Sales列中的數(shù)據(jù)匯總,從而使得RANKX排序的依據(jù)結(jié)果都相同,所有Rank No都是1。
要解決以上兩個(gè)問題可以創(chuàng)建一個(gè)Measure計(jì)算SUM(Sales[Sales]),之后再使用ALL函數(shù)清空其他篩選條件對排序表單的影響,公式改寫為:
1 TotalSales = SUM(Sales[Sales])
2 SalesRank = RANKX(ALL(Sales[Product]),[TotalSales],,DESC)

如果增加一個(gè)Country列參與排序,SalesRank公式仍然可以對Product數(shù)據(jù)進(jìn)行正確排序,但是對Country列的排序并不正確。之所以有這樣的結(jié)果原因是當(dāng)前SalesRank公式只對以Product列為基準(zhǔn)的TotalSales進(jìn)行了排序,Country的TotalSales并沒有參與計(jì)算,因此在降序排列條件下SalesRank值被統(tǒng)一賦值成最大排序號1。

要解決該問題,需要在排序時(shí)進(jìn)行分類,然后對Product列下數(shù)據(jù)和Country列下數(shù)據(jù)分別進(jìn)行排序。
對于分類,可以創(chuàng)建一個(gè)Measure使用方法如下:
1 ISCountry =
2 COUNTROWS ( Sales )
3 = CALCULATE ( COUNTROWS ( Sales ), ALL ( Sales ), VALUES ( Sales[Country] ) )

為了便于說明臨時(shí)將上一個(gè)公式拆解成兩個(gè)measure
第一部分COUNTROWS ( Sales )的計(jì)算結(jié)果受到measure所在的篩選上下文條件影響。如果是以Country列作為篩選條件,可以計(jì)算出每個(gè)Country列下對應(yīng)值的行數(shù),例如Australia有5行,USA有4行。如果以Product作為篩選條件,可以計(jì)算出每個(gè)Product列下值對應(yīng)的行數(shù),例如Accessories有5行,Computers有2兩行。如果由Country列+Product列共同作為篩選條件,則每個(gè)國家每種產(chǎn)品對應(yīng)的行數(shù)都=1。
第二部分CALCULATE ( COUNTROWS ( Sales ), ALL ( Sales ), VALUES ( Sales[Country] ) ),通過CALCULATE以及ALL和VALUES函數(shù)將COUNTROWS ( Sales )限定為只依據(jù)Country列作為篩選條件。在這一前提下,即使measure所在的篩選條件是Country列+Product列,該公式也只會按照篩選條件為Country列做輸出結(jié)果。因此可以判斷,當(dāng)?shù)谝徊糠纸Y(jié)果和第二部分結(jié)果相同時(shí),當(dāng)前行對應(yīng)的數(shù)據(jù)是Country。

有了這個(gè)ISCountry列之后就可以用其判斷當(dāng)前行數(shù)據(jù)的類型,之后分別針對該數(shù)據(jù)類型進(jìn)行排序即可獲得想要的排序結(jié)果。使用公式如下:
1 NewRank =
2 IF (
[ISCountry],
RANKX ( ALL ( Sales[Country] ), [TotalSales],, DESC ),
RANKX ( ALL ( Sales[Product] ), [TotalSales],, DESC )
)
這里面,如果當(dāng)前行數(shù)據(jù)是Country,則使用ALL函數(shù)基于Country列生成一個(gè)子表單進(jìn)行排序。如果前行數(shù)據(jù)是Product則使用ALL函數(shù)基于Product列生成一個(gè)子表單進(jìn)行排序。









暫無數(shù)據(jù)