EARLIER函数是DAX中两个使用起来稍微绕脑的函数,它的功能是当表达式中出现嵌套行上下文场景时,通过在内层表达式中使用EARLIER函数,可以从当前行上下文中挑出,到外层行上下文去引用数据用于计算。
例如,当需要计算产品的累计销量时,就可以利用EARLIER函数。
Cum_Sales =
SUMX (
FILTER (
Customer,
Customer[Customer] = EARLIER ( Customer[Customer] )
&& Customer[Date] <= EARLIER ( Customer[Date] )
),
Customer[Total_Sales]
)
表达式Cum_Sales中包含两层嵌套上下文环境,内层是通过FILTER函数形成的子表单所规定的上下文环境,外层是计算列Cum_Sales本身所在的表单中的上下文环境。通过EARLER函数功能,将当前外层表单中的Customer列和Date作为条件,引入到了FILTER函数里面,用来作为生成子表单的筛选条件。从而可以获得产品销售量累加结果。
由于EARLER函数是在嵌套环境中进行使用,并且需要在不同层级当中跳跃式的获取数据,是的表达式的使用上稍显复杂。为了减少误用EARLER函数,可以通过使用自定义变量来代替EARLER函数,来获得同样的计算效果。
由于自定义变量本身有一个特点,即其计算结果仅仅与调用它的最外围表达式最初所在的上下文有关,不会受到调用它的函数内部修改的上下文关系所影响。因此在可以通过使用自定义变量来替换EARLIER函数和EARLIEST函数,使得表达式更加清晰易懂。
例如上面的公式可以用下面的自定义变量来替换。
Cum_Sales_VAR =
VAR Current_Customer = Customer[Customer]
VAR Current_Date = Customer[Date]
RETURN
SUMX (
FILTER (
Customer,
Customer[Customer] = Current_Customer
&& Customer[Date] <= Current_Date
),
Customer[Total_Sales]
之所以自定义变量Current_Customer可以替换EARLIER ( Customer[Customer] )是因为,自定义变量是在调用它的最外层函数SUMX本身所在上下文环境中进行运算,而不是在FILTER函数内重新建立的上下文中运行。
例如,当Cum_Sales_VAR 表达式运行到Customer = Forth Coffee,Product = Computers,Date = 3/1/2017,Amount = 50,Total_Sales = 25000,Cum_Sales = 26500这一行时,自定义变量Current_Customer在当前上下文中获取Customer值,为Forth Coffee,而另外一个自定义变量Current_Date的值则为3/1/2017。这样,对于FILTER函数,其过滤条件就变成获取满足Customer[Customer] = Forth Coffee并且Customer[Date] <= 3/1/2017的子表单。这与之前使用EARLER来获取将当前外层表单中的Customer列和Date作为FILTER函数内使用的过滤条件效果相同,因此可以用自定义变量来代替表达式中的EAELER函数。