很久没写文了,简单阐述一下DAX的计算上下文,希望能够助力于大家的 DAX 学习之旅。
计算上下文有两种:1) 筛选上下文 2)行上下文
1)筛选上下文
通过应用一组筛选器去筛选模型,使得表达式在被筛选模型的子集进行计算,也可以将筛选上下文生效的结果描述为经过筛选后的模型中可见的所有行。所以筛选上下文正式的定义就是一组筛选器。(个人理解跟 SQL 中的 WHERE 和 GROUGBY 差不多)。
按照具体筛选上下文的形状又可以分为两种,简单形状和任意形状。即多列筛选器中关于列的组合可以通过列筛选器简单笛卡尔积形成的就是简单形状,反之就是任意形状筛选器(一般都会比简单形状范围要小)。注意这里要跟固化筛选器进行区分,上面是根据筛选器形状去进行划分,如果固化筛选器中的组合本身就是笛卡尔积的结果,那么也是简单形状的筛选器。
筛选器的来源可以是切片器、其他视觉对象的选中项、筛选器选项卡、行列标签等。
当我们要去分析某一个表达式的筛选上下文时,需要定位到具体的单元格中或者说视觉对象具体的位置去分析,也就是不同位置的筛选上下文一般都是不一样的,所以切记一定要针对具体的对象去分析,不然不能得到正确的筛选上下文。某一具体单元格的筛选上下文是通过合并来自行列标签、切片器、筛选器选项卡和任何其他用于筛选视觉对象的所有筛选器作为该单元格的初始筛选上下文,微软官方文档会将这个合并结果称之为查询上下文,因为实际分析过程中与来自于 CALCULATE 筛选器参数形成的筛选上下文没有明显不同,所以参照权威指南将这查询上下文和筛选上下文归类成筛选上下文也没有什么不妥,但是本文只计划初步介绍筛选上下文,没打算深入介绍CALCULATE中的筛选器参数形成的筛选上下文。
数据源使用将以下表表达式输入到模型的步骤:
1)主页=>输入数据=>粘贴以下表
颜色 | 产品 | 数量 |
---|---|---|
红 | 手机 | 1 |
蓝 | 手机 | 2 |
红 | 电脑 | 3 |
蓝 | 电脑 | 4 |
2)新建# 数量 度量值。
# 数量 = SUM('计算上下文数据源'[数量]) // 度量值
在上面例子中针对标记的这个单元格的初始筛选上下文就是,一方面来自行标签的'数据源'[产品]列的{"手机"}筛选器,另一方面是条形图中选中的'数据源'[颜色]列的{"红"}筛选器组合而成的'数据源'[产品]的{"手机"} && '数据源'[颜色]列的{"红"},一般而言一个筛选器指的是列筛选器或固化筛选器,而筛选上下文就是这些筛选器组合而成的结果,注意千万不要与应用筛选上下文后的模型数据子集混淆。
2)行上下文
跟一次具体的迭代相关联,所谓迭代就是从前往后一次访问一个具体的表的一行直至访问完表的所用行为止的过程,而行上下文就是在这个具体的迭代过程中标记当前迭代行并提供访问(个人理解类似于在 SQL 中所说的游标,都是用来标记当前迭代的行)
最后需要说明的就是,开启一次具体的迭代有两种方式,一种就是存在于模型中的表,由引擎自动开启的迭代。另一种就是由用户去使用迭代函数(如FILTER、SUMX、ADDCOLUMNS等)来开启的迭代,有且仅有这两种开启迭代的方式。