[初接触] DAX 中的行上下文与EARLIER() 函数

POWER BI中函数处理的对象的最小单位是列,这意味着,每一次计算都是在这个列中做一次完整的迭代循环计算。

不论是 SUMX() 还是 FILTER() ,给一个参数(列),函数内部都会在这个列中从头到尾,把所有数值计算一遍。

基于这种特性,我们不需要自己在DAX中写迭代代码,因为已经封装到函数内部了。也以此认识到每次用如 SUMX() 计算函数,都至少会有一个迭代循环发生。

EARLIER() 在行上下文中的角色

官方说明:https://msdn.microsoft.com/zh-cn/library/ee634551.aspx

官方的说明向来拗口,以下列案例说明,计算比自身 Cost 大的 Cost 的合计

这里用了两个函数,一个SUMX(), 一个是 FILTER(), 两个内部都有迭代循环,而且在这个例子中是迭代同一列。

在一般的编程语言中很好理解,就是一个循环嵌套,在DAX变得更加抽象了,这个例子如果用其它编程语言来写话,类似于下面这样:

同一组数据,被嵌套迭代了两次,由于DAX函数每次都是处理一列,不像其它编程语言以数组下标或指针的方式访问一个个具体的元素值。而是统一以  ‘[] 的方式表示,具体的元素值在函数内部处理。

这个表达式中,蓝色框中的 ‘表'[列] (’Sheet1′[Cost])表示第一次迭代循环中的当前行值,红色框中表示第二次迭代循环中的当前行值。

第二次迭代循环中的当前行值要与第一次迭代中的当前行值计算,肯定不是’Sheet1′[Cost]和’Sheet1′[Cost]比较。这里用了 EARLIER() 来传递外层迭代循环中的当前行值,让它参与到内层循环的计算中

讨巧一点方法就是用一个变量来存储外层迭代循环中的当前行值,这样比使用 EARLIER() 更好理解一点

关于行上下文的理解,可以看看这篇:PowerBI中DAX语言的上下文是什么

4 thoughts on “[初接触] DAX 中的行上下文与EARLIER() 函数”

  1. 看了很多文章都对earlier似懂非懂,你这篇文章绝了,秒懂。

    1. 没写好,自己理解了是一回事,把理解的再表达出来又是一回事,更多的是加强自我理解,建议你也可以尝试这么做,对新知识的理解很有帮助。

Leave a Reply

Your email address will not be published. Required fields are marked *