實際應用中一般使用路徑成本來計算排名,今天小夥伴因為特殊場景需要,必須采用計算列來顯示排名。
如上圖所示,需要用計算列來顯示不同員工不同地區,按照時間降序排列的排名。群裡各路大神陸續出招,給出不同解法,我是幹着急寫不出來。。。
看了大神給的招數,了解了一下,
Countrows
和
Rankx
解法,兩種模式都有接觸,還是實踐太少,了解的不夠紮實。下面咱們就來理一理,到底該如何實作。
1. Countrows + Earlier 解法
countrows
經典句型:
countrows(filter('tb','tb'[col]=earlier('tb'[col])))
複制
就是統計滿足條件的行數(EARLIER表示目前行),這個問題的條件複雜了一些,多重條件同時滿足用
&&
即可,代碼呼之欲出。
計算列排名 = COUNTROWS(FILTER('tb',
'tb'[員工]=EARLIER(tb[員工])&&
'tb'[地區]=EARLIER(tb[地區])&&
'tb'[時間]>=EARLIER(tb[時間])))
複制
2. Countrows + Var解法
佐羅大佬今天明确表示要抛棄
earlier
的使用,咱也不太懂為啥,聽老大的就對了。
var
功能強大于
earlier
,其創造了一個可疊代的變量,代碼如下:
var計算列排名 =
var who = 'tb'[員工]
var country = 'tb'[地區]
var dtime = 'tb'[時間]
var T = FILTER('tb','tb'[員工]=who&&'tb'[地區]=country&&'tb'[時間]>=dtime)
var myrank = COUNTROWS(T)
RETURN myrank
複制
代碼行數雖然多了,可能更好了解一點。
3. Rankx解法
Rankx
本來就是
DAX
中用來計算排名的标準用法,
Rankx
文法
這裡的思路就是先過濾出相同員工相同地區不同時間的表,再給這張表按照時間進行降序排名
Rankx計算列排名 =
var who = 'tb'[員工]
var country = 'tb'[地區]
var T = FILTER('tb','tb'[員工]=who&&'tb'[地區]=country)
var myrank = RANKX(T,'tb'[時間],,DESC,Dense)
RETURN myrank
複制