理解行上下文 |
您所在的位置:网站首页 › 统计power的理解 › 理解行上下文 |
任何 DAX 表达都是在上下文中计算的。上下文是公式计值的“环境”,也就是说,公式的结果始终受到环境的影响。总有两种上下文,它们分别是:筛选上下文和行上下文,统称为计值上下文。这篇文章让我们来认识行上下文 初识行上下文这次,我们思考一个不同的公式: Sales[GrossMargin] = Sales[SalesAmount] - Sales[TotalCost]你可能会在计算列中编写这样的表达式,以便计算毛利。在计算列中定义此公式后, 你将得到下面这个结果。 为表的所有行计算毛利 DAX 为表的所有行计算公式, 对于每一行, 它都按预期计算出了不同的值。为了理解行上下文,我们在阅读公式时需要有点较真精神:我们要求减去两列,但我们在哪里告诉 DAX 从表的哪一行获取列的值?你可能会说要使用的行是隐式的。因为这是计算列,DAX 会逐行计算,对于每一行,公式返回不同的结果。这种理解是正确的,但是从 DAX 表达式的角度来看, 关于使用哪一行的信息仍然缺失。 实际上,用于执行计算的行并不存储在公式中。它由另一种上下文定义:行上下文。当定义计算列时,DAX 从表的第一行开始迭代;它创建了一个包含该行的行上下文并计算表达式。然后它移到第二行,再次计算表达式。此行为发生在表的所有行,如果表有一百万行,你可以认为 DAX 创造了一百万个行上下文来计算公式一百万次。显然,为了优化计算,真实情况并非如此;否则的话 DAX 将是一种非常慢的语言。无论如何,从逻辑的角度来看,这就是它的工作原理。 计算列逐行计算数量*价格 总有两种上下文到目前为止,你已经了解了什么是行上下文和筛选上下文。它们是修改公式结果的最常见的途径。任何公式都将在这两个不同的上下文中进行计算:行上下文和筛选上下文。 我们称这两种上下文为计值上下文,因为它们改变了公式计值的方式,为同一个公式提供了不同的结果。 这是一个非常重要并且很难在初期就意识到的问题:总是有两种上下文,一个公式的结果同时取决于这两个上下文。身处 DAX 学习路径的当前阶段,你可能认为这是显而易见的,非常自然。你也许是对的。然而,在后面的文章中,一旦你不记得这两种上下文的共存关系,你就会发现公式变得难以理解,因为每一个上下文都有可能改变公式的结果 创建行上下文的方式你已经了解了当定义计算列时可自动创建行上下文,这是由于在此种情况下 DAX 表达式基于逐行计值。现在是时候来学习如何通过迭代器在 DAX 表达式内部创建行上下文了。 我们知道在 DAX 中以 X 结尾的函数都是迭代函数,它们循环整张表并为每行计值一个表达式,最后使用不同算法来聚合结果。例如,在以下 DAX 表达式中: [IncreasedSales] := SUMX ( Sales, Sales[SalesAmount] * 1.1 )SUMX 是一个迭代函数。它迭代整个销售表且每行都对销售金额按 10%加成来计值,最后返回所有这些值的总和。为了对每行计值该表达式,SUMX 对销售表创建了行上下文并用于迭代过程中,使得内层表达式(SUMX 的第二个参数)在包含了当前迭代行的行上下文中计值。 重要的是要注意,在整个计值流中 SUMX 的不同参数使用了不同上下文。现在让我们更近一步观察该表达式: = SUMX ( Sales, ← 外部上下文 Sales[SalesAmount] * 1.1 ← 外部上下文和新的行上下文 )第一个参数 Sales 在计值时使用了来自外部环境(例如可能是一个数据透视表单元格,其他度量值或查询的一部分)的上下文,而第二个参数(表达式)计值时同时使用了外部上下文和新创建的行上下文。 所有迭代器均以相同方式工作,具体如下: 在作为第一参数接收到的表上创建一个新的行上下文。 对于表中的每一行,在新创建的行上下文内部对第二个参数计值(也包括在迭代开始前已经存在的其他上下文)。 如果迭代器需要,对步骤 2 中计算出的值进行聚合。(还有一些迭代函数如 FILTER 和 ADDCOLUMNS 不执行此聚合步骤) 重要的是要记住:原始上下文在表达式内部仍然有效。迭代函数仅添加了一个新的行上下文,而不以任何方式修改已有上下文。该规则几乎总是有效的,但有一个重要例外:对于同一张表,如果之前上下文中已包含了行上下文,那么此行上下文被新创建的行上下文覆盖。在下一篇文章中我们会详细讨论这个问题。 行上下文总结 本文隐藏内容查看价格为2G币,请先登录单独购买的内容长期有效,不受时间限制(购买前先刷新当前页面)。加入VIP会员可享受全站权益,性价比更高。 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |