今天看啥  ›  专栏  ›  PowerBI入门到实践

DAX从入门到精通 4-1-1 学习行上下文

PowerBI入门到实践  · 简书  ·  · 2019-07-02 22:59

筛选上下文是DAX中上下文类型的其中之一,另外一种是行上下文,本节,我们会学习什么是行上下文,它如何工作。
这里,我们用另外一个函数来作为例子:

Sales[GrossMargin] = Sales[SalesAmount] - Sales[TotalCost]

通常我们在计算列中,会这样来书写表达式,用来计算gross margin(毛利润)。一旦你在计算列中定义了这个函数,我们就会得到如下的结果表:


image.png

DAX对表格的每行都进行了计算,每行的值都是不同的,这个和我们设想的一致。为了理解行上下文,我们要对函数咬文嚼字一下:函数中,我们要求对两列相减,但是我们有告诉函数使用列中的哪两行来计算减法吗?你会说其所使用的行是默认的。因为它是个计算列,DAX逐行的计算,对于每行,它都得到一个不同的结果。这个是对的,但是,从DAX表达式的角度来看,使用哪一行作为计算的依据,还是不确定的。
事实上,使用哪一行作为计算的依据并不是存储在函数中。它是由另外一种上下文决定的:行上下文。当你定义了一个计算列,DAX启动了一个迭代器,从表格的第一行开始。对于每行,都产生一个行上下文用于计算结果。逐行都是这样的方式,如果有1百万行,你可以认为这样的计算逻辑会重复1百万次。不过,DAX有其内在的优化处理,并不是这样简单的重复,否则的话,DAX会是一个非常缓慢的计算引擎,但是从理解的逻辑上看,可以这样去理解。
更准确的定义行上下文,它总是包含了一个行,DAX在创建计算列的时候会自动生成。你还可以使用其他的技术来生成行上下文,这个后面我们会讨论,但是要简单的去解释行上下文,就是通过计算列。

两种上下文
现在,你已经学习了什么是行上下文,什么是筛选上下文。DAX中只有这两种上下文。因此,只有它们才能改变计算的结果。任何计算公式都是在这两种上下文环境下计算的。
这两种上下文使得不同的单元格,即使使用相同的函数,也会得到不同的结果。

下面这点对于初学者非常重要,也比较难以理解透彻:实际应用中,计算的结果通常是在这两种上下文同时作用的情况下计算出来的。本书到现在,你可能觉的这个很好理解。目前,也许你是对的。但是在本书接下去的内容中,你会发现有的函数,如果你没有意识到两种上下文的同时存在且同时作用,你会对结果难以理解。




原文地址:访问原文地址
快照地址: 访问文章快照