DAX:概述EARLIEST和EARLIER函數

EARLIEST和EARLIER函數只用於行上下文中,並且主要用於計算列的行上下文中。行上下文的作用是迭代,逐行掃描表,並且不會篩選數據。

EARLIER函數用於訪問外層行上下文,即使用外層行上下文,而不是最內層的行上下文檢索列的值。

EARLIER(<column>, <number>) 
EARLIEST(<column>) 

注意:EARLIER函數的第二個參數是可選的,默認值是1,表示要跳過的層數,可以向外跳過2層或多層行上下文。EARLIEST函數直接訪問最外層的行上下文。

自從變量出現之後,EARLIER函數的所有功能都可以通過變量來實現,並且更直觀和高效。

舉個例子,創建計算列,對產品的價格進行排序:

方法1:使用EARLIER函數實現Dense Rank,DAX實現的思路:

  • 計算列會創建外層的行上下文,FILTER函數是迭代函數,會創建一個行上下文,這是內層行上下文。
  • 由於外層的行上下文不會篩選數據,因此,VALUES('Product'[UnitPrice])得到的是整個表的UnitPrice。
  • EARLIER('Product'[UnitPrice])訪問外層行上下文,得到當前行的UnitPrice。
  • FILTER函數過濾UnitPrice,得到比當前行的UnitPrice大的所有數據行,COUNTROWS計算其行數就得到當前行的UnitPrice的排名。
  • 外層(由計算列產生的)行上下文迭代表,把公式應用到下一行,計算下一行的UnitPrice的排名。
'Product'[UnitPriceRankDense] =
    COUNTROWS( FILTER( VALUES('Product'[UnitPrice]),'Product'[UnitPrice] > EARLIER('Product'[UnitPrice]))
        )

方法2:使用變量實現等價的Dense Rank:

'Product'[UnitPriceRankDense] =

VAR PriceOfCurrentProduct = 'Product'[UnitPrice]
VAR HigherPrices =  FILTER( VALUES('Product'[UnitPrice]), 'Product'[UnitPrice] > PriceOfCurrentProduct )
RETURN COUNTROWS(HigherPrices) + 1

 

 

參考文檔:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章