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
参考文档:
作者:悦光阴
本文版权归作者和博客园所有,欢迎转载,但未经作者同意,必须保留此段声明,且在文章页面醒目位置显示原文连接,否则保留追究法律责任的权利。