天天看點

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. Rankx解法

實際應用中一般使用路徑成本來計算排名,今天小夥伴因為特殊場景需要,必須采用計算列來顯示排名。

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. Rankx解法

如上圖所示,需要用計算列來顯示不同員工不同地區,按照時間降序排列的排名。群裡各路大神陸續出招,給出不同解法,我是幹着急寫不出來。。。

看了大神給的招數,了解了一下,

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[時間])))
           

複制

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. Rankx解法

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
           

複制

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. Rankx解法

代碼行數雖然多了,可能更好了解一點。

3. Rankx解法

Rankx

本來就是

DAX

中用來計算排名的标準用法,

Rankx

文法

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. 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
           

複制

DAX | 計算列排名1. Countrows + Earlier 解法2. Countrows + Var解法3. Rankx解法