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
參考文檔: