DAX的行上下文和迭代函数和EARLIER函数叠加使用时是如何计算(计算过程实例)(ROW CONTEXT & ITERATED FUNCTION & EARLIER)

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

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.
最终所有行的结果为
在这里插入图片描述

<think>首先,用户的问题是:“我想了解Power BI中EARLIER函数使用方法 请问Power BI EARLIER函数用法及示例”。根据系统指令,我需要使用中文回答,并确保LaTeX语法正确:内数学表达式用$...$,独立公式用$$...$$。 系统指令还要求生成相关问题,并在回答中引用的段落末尾自然地添加引用标识,如[^1]。参考了站内引用,包括[^1]、[^2][^3],这些是关于EARLIER函数的用法示例。 关键点: - EARLIER函数DAX中用于处理嵌套的上下文。 - 典型场景:在计算列中使用FILTER,引用外层上下文的值。 - 示例:计算排名或计数。 我的回答结构应清晰,帮助用户逐步解决问题: 1. 解释EARLIER函数的基本概念。 2. 描述其使用场景语法。 3. 提供示例代码解释。 4. 添加相关问题。 步骤: - 开头简要介绍EARLIER函数。 - 然后详细说明用法。 - 给出示例,参考引用中的例子。 - 结束生成相关问题。 参考引用: - [^1]: EARLIER用于在嵌套的上下文中引用外层上下文的值。 - [^2]: 示例:使用FILTEREARLIER计算排名。 - [^3]: 涉及SUMMARIZEADDCOLUMNS,但EARLIER是焦点。 确保回答真实可靠:基于DAX知识,EARLIER确实用于处理上下文。 最终回答结构: 1. 介绍EARLIER函数。 2. 用法解释。 3. 示例。 4. 相关问题。</think>### Power BI 中 EARLIER 函数的用法及示例 在 Power BI 的 DAX(Data Analysis Expressions)语言中,`EARLIER` 函数用于处理嵌套的上下文row context),特别是在计算列中需要引用外层上下文的值。当使用函数如 `FILTER` 或 `CALCULATE` 创建嵌套上下文,`EARLIER` 能帮助您访问外层上下文中的当前值,避免混淆。这在计算排名、累计值或复杂条件筛选非常有用。 #### EARLIER 函数的基本语法用法 - **语法**: `EARLIER(<column>, <number>)` - `<column>`: 要引用的列名。 - `<number>`: 可选参数,指定嵌套层数(默认为 1,表示外层上下文)。 - **核心作用**: 在嵌套的上下文中(例如,内层 `FILTER` 循环中),`EARLIER` 引用外层上下文中的值。这在计算列中常见,因为计算列自动创建上下文。 - **使用场景**: - 计算排名(如内排名)。 - 比较同一表中的值(例如,计算每个值小于或等于其他值的次数)。 - 避免上下文冲突,确保公式正确引用外层。 #### 示例:使用 EARLIER 计算排名 以下是一个完整的示例,基于一个数据表(假设表名为 `分数表`,包含列 `分数` `标签`)。我们将创建一个计算列,计算每个分数的排名(数值越小排名越靠后)。 **步骤解释**: 1. **数据准备**: 假设 `分数表` 有数据: - `标签`: 1, 2, 3, ... - `分数`: 95, 85, 90, ...(示例数据:95 出现多次,表示低分)。 2. **目标**: 添加一个计算列 `排名`,计算每个分数在表中的排名(分数越小,排名数值越大)。 3. **DAX 公式逻辑**: - 使用 `FILTER` 创建一个虚拟表,遍历所有。 - 在 `FILTER` 内部,用 `EARLIER` 引用外层上下文的当前值。 - 计算每个分数满足“小于或等于其他分数”的次数,次数越多表示排名越靠后。 4. **DAX 代码实现**: ```dax 排名 = COUNTROWS( FILTER( 分数表, 分数表[分数] <= EARLIER(分数表[分数]) ) ) ``` - **代码解释**: - `FILTER(分数表, 条件)`: 创建一个虚拟表,只包含满足条件的(条件:当前的分数小于或等于外层的分数)。 - `EARLIER(分数表[分数])`: 引用外层上下文的 `分数` 值(即当前计算的原始分数)。 - `COUNTROWS(...)`: 统计满足条件的数,这个数值就是排名(例如,分数 95 在虚拟表中出现 4 次,则排名为 4)。 - 结果:对于低分(如 95),它满足更多的条件,因此排名数值高;对于高分(如 90),排名数值低[^2]。 **示例输出**: 假设数据: | 标签 | 分数 | 排名(计算后) | |--------|------|----------------| | 1 | 95 | 4 | | 2 | 85 | 1 | | 3 | 90 | 2 | | 4 | 95 | 4 | - 解释:分数 95 的排名为 4,因为它小于或等于所有(包括自身),所以 `FILTER` 虚拟表中它出现 4 次[^2]。 #### 注意事项 - `EARLIER` 主要用于计算列,而非度量值,因为度量值通常不涉及上下文。 - 在嵌套较深(如双重 `FILTER`),使用 `<number>` 参数指定层数(例如 `EARLIER(列, 2)`)。 - 替代方案:在简单场景中,可用变量(如 `VAR`)简化,但 `EARLIER` 在复杂嵌套中更直接。 - 性能:`EARLIER` 可能导致计算开销,尤其在大数据集中,建议测试优化[^1]。 通过以上示例,您可以看到 `EARLIER` 如何帮助在 DAX 中处理上下文冲突,实现动态计算。如果您有特定数据场景,可以提供更多细节进一步定制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值