DAX的行上下文和迭代函数和EARLIER函数叠加使用时的计算过程实例(ROW CONTEXT & ITERATED FUNCTION & EARLIER)
DAX的行上下文和迭代函数和EARLIER函数叠加使用时是如何计算的(ROW CONTEXT & ITERATED FUNCTION & EARLIER)
COUNTAX+FILTER+EARLIER时如何计算的
表’PC’(NodeId, Node, ParentNodeID)
内容如下图所示

calCol :=
COUNTAX (
FILTER ( 'PC', PC[ParentNodeID] = EARLIER ( 'PC'[NodeId] ) ),
'PC'[ParentNodeID]
)

对于这个计算列函数在这个表格上的每一行的值分别是多少,具体的计算流程是怎样的?
一、COUNTAX
整体上,公式是嵌套了 FILTER 函数的 COUNTAX 函数的迭代计数行。(这里插播一个小知识,DAX 中以X结尾的函数是迭代器函数)。
COUNTAX 的第一个参数是使用FILTER过滤函数进行过滤后得到的过滤表,第二参数是 ParentNodeID ,意思是对第一个参数返回的过滤表中的 ParentNodeID 列进行计算行数。
二、FILTER
说完全部的情况,我们来细说第二个参数: FILTER ( ‘PC’, PC[ParentNodeID] = EARLIER ( ‘PC’[NodeId] ) )。
这个参数使用了 FILTER 函数,FILTER 函数的作用是返回符合条件的表。这里则是对表 ‘PC’ 进行筛选,将满足 PC[ParentNodeID] = EARLIER ( ‘PC’[NodeId] ) 的行返回。
三、计算过程
首先,我们要注意到,这是一个计算列,这意味着,每一行都会返回一个结果。在这个场景中,意味着公式会返回9个结果,每一行都会进行一次计算。
那么对于具体某一行,如第1行,它的具体计算流程是怎样的呢?
因为 COUNTAX 是第一个迭代函数,所以它内部自动对参数中的表格进行每一行迭代,而在计算列中,DAX 又会自动产生行上下文,这意味着,这个公式会有两层循环。
对于公式 PC[ParentNodeID] = EARLIER ( ‘PC’[NodeId] ) ,到底哪一个是行上下文的值,哪一个是COUNTAX 的内部迭代行,这是一个指的探究的问题。
答案是:
EARLIER ( ‘PC’[NodeId] ) 是行上下文的值
PC[ParentNodeID] 是内部的迭代行
四、创建行上下文
第一行的计算流程,是这样的
即计算 EARLIER ( ‘PC’[NodeId] )=1 后带入公式,此时 COUNTAX 的第一个参数变为
FILTER ( ‘PC’, PC[ParentNodeID] = 1 ),
COUNTAX(FILTER ( ‘PC’, PC[ParentNodeID] = 1 ),‘PC’[ParentNodeID] )
五、创建迭代器
然后 FILTER ( ‘PC’, PC[ParentNodeID] = 1 ) 开始创建迭代器,对于 ‘PC’ 表,每一列 PC[ParentNodeID] 的每一行都进行代入计算,计算9次,每一次分别为
1: FILTER ( ‘PC’, ‘’ = 1 )
2: FILTER ( ‘PC’, ‘’ = 1 )
3: FILTER ( ‘PC’, 6 = 1 )
4: FILTER ( ‘PC’, 6 = 1 )
5: FILTER ( ‘PC’, 6 = 1 )
6: FILTER ( ‘PC’, 1 = 1 )
7: FILTER ( ‘PC’, 1 = 1 )
8: FILTER ( ‘PC’, 2 = 1 )
9: FILTER ( ‘PC’, 2 = 1 )
可以看到,第六、第七行的过滤条件满足要求,因此 FILTER ( ‘PC’, PC[ParentNodeID] = 1 ) 最终返回的表记为 ‘FILTER1TAB’ 。具体内容如下图所示

此时,公式变为
COUNTAX(‘FILTER1TAB’,‘FILTER1TAB’[ParentNodeID] )
可以看到,此时对 ‘FILTER1TAB’ 表的 ParentNodeID 列计数的结果为2。
因此,第一行的结果为2。
第二行也一样的流程,可以推算出结果为3.
最终所有行的结果为

本文通过实例详细解释了DAX中行上下文、迭代函数COUNTAX与FILTER以及EARLIER函数的结合使用方式。通过分析表格'PC'的计算列,展示了每一行如何利用EARLIER获取当前行的值,并在FILTER中进行迭代计算,最终得出每行的计数结果。
1256

被折叠的 条评论
为什么被折叠?



