CALCULATE函数详解
丨基础内容

语法=CALCULATE(<表达式>,<筛选器>,<筛选器>...)

基本用途:根据已有外部上下文构建一个新的上下文进行求值。

CALCULATE函数属于最灵活多变的函数,那么其内部到底是怎样的运行环境呢?其优先级又是怎样评定的呢?

白茶之前写过很多期关于CALCULATE函数实际运用的例子,本期呢,白茶决定详细描述一下CALCULATE函数的内部问题。

注:本期内容,属于进阶知识,不适合刚刚学习DAX的小伙伴。


丨五大因素

首先是对于能够影响CALCULATE函数的五大因素进行系统的划分:

A、外部的双向筛选,激活与未激活的关系,例如可视化插件点击影响,这里定义为显性筛选

B、能够访问的条件,例如行上下文和切片器,这里定义为外部筛选

R、访问的条件转化为当前上下文,比如源数据是1K行,这里根据外部筛选转化为当前15行的数据,这里定义为转化筛选

S、来自内部的屏蔽器,忽略外部的影响,例如ALL函数这一类,这里定义为屏蔽筛选(也可以称之为清除筛选)。

SS、来自内部的表函数重新构造的筛选条件,例如FILTER函数这一类,这里定义为表筛选

丨优先级

然后是对于五大因素的优先级进行一个排序:

A < B < R < S < SS

即:

显性筛选<外部筛选<转化筛选<屏蔽筛选<表筛选

白茶会通过具体的案例数据,来描述一下五大因素的优先级。

丨案例说明

模拟数据:


A、显性筛选

可能小伙伴看文字不明白什么叫显性的筛选,这里用图片说明一下。

从模型关系图片中我们能看出“切片器”这个表和“例子”表存在一对多的关系。

类似于上图的关系,两个可视化插件同时存在,这个时候两个插件可以相互的进行影响,这种情况就是双向筛选关系。

类似于模型表中激活与未激活的关系,以及双向筛选这类的,都属于显性筛选。虽然这类筛选会影响CALCULATE函数的结果,但本质上并不是影响其内部上下文顺序,因此这类影响通常是忽略不计的。

这也是为什么A级(显性筛选)优先级最低的原因。因为其只是单纯的在新上下文中起作用。


B、外部筛选

什么才叫能够访问的条件?最直观的例子是行上下文。

当我们使用CALCULATE函数对某个表达式进行聚合的时候,数据的直接来源就是行上下文。

CALCULATE根据外部的筛选条件生成新的上下文环境,一个来源于外部,一个来源于内部,因此外部的优先级是低于内部三个筛选条件的。

但是外部上下文却是CALCULATE函数的外部基石。

说具体点:

在一块空地上建了一栋别墅;

地值50W,别墅建造以及装修花了300W;

这个时候,建造费用和装修费用是评判这个别墅价值的主要原因;

但是没有这块地,这个别墅也不存在,因为是其外在的基础、基石。


R、转化筛选

每当我们使用CALCULATE函数进行外部包裹的时候,就已经进行上下文转换了,这个时候访问条件转化为内部的筛选条件。

这一过程是不受人为控制的,当外部条件和内部条件同时作用一列时,内部的优先级是大于外部的。

举个例子:

代码1:

外部筛选 =
RANKX ( ALL ( '例子' ), SUM ( '例子'[销售] ) )

代码2:

转化筛选 =
RANKX ( ALL ( '例子' ), CALCULATE ( SUM ( '例子'[销售] ) ) )

表1代表的可以理解为当前上下文,原始数据中白茶特地构建了三个没有数据的日期。

表2代表的是行上下文无法转化为当前上下文,这也是为什么RANKX结果全是1的原因,因为没有取到正确的值,所以无法正确排序。

表3代表的是通过CALCULATE函数将行上下文转化为了当前上下文,即当前上下文的筛选条件对于SUM聚合生效,所以能获得每一个日期对应的数据值,因此RANKX函数生效,求出正确排名。

这个时候可以理解CALCULATE是在外部筛选,即行上下文的基础上,将其进行转化生成新的上下文,即计算上下文。

通过显性筛选可以发现并没有对CALCULATE函数的内部运算产生影响,只是单纯的起作用,影响结果的呈现。


S、屏蔽筛选

类似于ALL这类函数的屏蔽作用,可以抵消掉前两者的影响。

例子:

屏蔽筛选 =
CALCULATE ( SUM ( '例子'[销售] ), ALL ( '例子' ) )

从上图中可以看到,无论是双向筛选关系,外部筛选的行上下文和切片器,还是内部产生的计算上下文,在ALL函数面前统统是失效的。

这个时候屏蔽筛选的优先级是远远大于前三者的。


SS、表筛选

类似于FILTER或者VALUES函数这种可以生成新表的表函数,优先级大于前四者。

例子1:

表筛选1 =
CALCULATE ( SUM ( '例子'[销售] ), ALL ( '例子' ), FILTER ( '例子', '例子'[日期] <= 2017 ) )

例子2:

表筛选2 =
CALCULATE ( SUM ( '例子'[销售] ), ALL ( '例子' ), VALUES ( '例子'[日期] ) )

从上面的动图中可以看出,CALCULATE函数内部表函数生成的筛选条件,相当于自己的亲儿子,可以完全抵消掉显性筛选、外部筛选、转化筛序以及屏蔽筛选的效果,一切以它为基准。


从上述所有的示例中,我们可以判断得出,CALCULATE函数对于执行顺序,即优先级划分是遵照前面白茶描述那样进行的:

A(显性筛选)<B(外部筛选)<R(转化筛选)<S(屏蔽筛选)<SS(表筛选)

关于行上下文和筛选上下文有时候不是那么特别容易区分,一不留神就容易搞混。

对于学过编程的小伙伴来说还好,类似于作用域。但是对于像白茶这种没接触过互联网代码的人来说,理解起来真的很吃力。

嘿神是这样说的:

行上下文类似于地球,有固定的经纬度,可以按照经纬度索引查找地理位置;

而筛选上下文是划分范围,需要知道你想上哪个国家,才会告诉你怎么去;

才会告诉你那里位于南北纬东西经的位置,那里有个什么地方。

即:筛选上下文→迭代器→激活行上下文→索引取值→值运算。

好了,关于CALCULATE函数的所有内容到本期彻底告一段落了,希望能对看到这里的小伙伴有所帮助。

至于后面的CALCULATETABLE函数,其内部的优先级原理与前者差不多,白茶就不赘述了。


小伙伴们❤GET了么?
白茶会不定期的分享一些函数卡片
(文件在知识星球[PowerBI丨需求圈])

这里是白茶,一个PowerBI的初学者。

精品丨CALCULATE函数进阶版知识相关推荐

  1. 各大厂大数据精品分享汇总(进阶版)

    微信端打开 美团 美团外卖流量数据的采集加工和应用 美团外卖实时数仓建设实践 美团外卖离线数仓建设实践 美团 Flink 实时数仓应用经验分享 Druid SQL和Security在美团的实践 菜鸟实 ...

  2. 精品丨DAX性能优化问题

    BOSS:那个,白茶啊,这个报表刷新有点慢啊,你看,每次我点筛选或者刷新都会让我等很久. 白茶:(认真脸)BOSS,那您再等会就好! - BOSS:白茶!!两小时了!!还没出来!! 白茶:(思考)老板 ...

  3. 学习CALCULATE函数(六)丨帕累托之累计求和

    (写在前面的话:非常感谢 @韭菜大神和 @冬神的指点,万分感谢.) 哎,说归说,还是需要继续学习CALCULATE函数,也是蛮无奈的.最近白茶在研究帕累托分析法,本期分享一下帕累托ABC分析法的基础- ...

  4. 函数周期表丨筛选丨值丨CALCULATE

    ​CALCULATE函数 CALCULATE函数,被微软划分为"筛选"类函数,隶属于"值函数". 如果说ALLSELECTED函数是所有函数中最为复杂的一个,那 ...

  5. 空间连接时计算总和_学习CALCULATE函数(六)丨帕累托之累计求和

    (写在前面的话:非常感谢@韭菜大神和@冬神的指点,万分感谢.) 哎,说归说,还是需要继续学习CALCULATE函数,也是蛮无奈的.最近白茶在研究帕累托分析法,本期分享一下帕累托ABC分析法的基础--累 ...

  6. 【进阶版】机器学习之决策树知识与易错点总结(06)

    目录 欢迎订阅本专栏,持续更新中~ 本专栏前期文章介绍! 机器学习配套资源推送 进阶版机器学习文章更新~ 点击下方下载高清版学习知识图册 决策树 决策树基本概念 决策树的构造 ID3算法 C4.5算法 ...

  7. 学习CALCULATE函数(五)修订版

    哈喽,小伙伴们,头几次白茶分享了单条件聚合.多条件聚合.各类占比.以点带面聚合,本期呢,咱们继续研究CALCULATE函数. 白茶最近思考了一下,就是CALCULATE函数,为什么它是最灵活的,也是使 ...

  8. 【进阶版】机器学习之支持向量机细节回顾及原理完善(09)

    目录 欢迎订阅本专栏,持续更新中~ 本专栏前期文章介绍! 机器学习配套资源推送 进阶版机器学习文章更新~ 点击下方下载高清版学习知识图册 支持向量机 函数间隔与几何间隔 函数间隔 几何间隔 最大间隔与 ...

  9. 函数周期表丨时间智能丨值丨TOTAL函数系列(修订)

    TOTAL函数系列 TOTAL函数系列共包含三个函数:TOTALMTD函数,TOTALQTD函数,TOTALYTD函数. 隶属于"值函数",用途相对于DATESMTD系列函数更为直 ...

最新文章

  1. 关于C语言中printf函数“输出歧视”的问题
  2. android 读取内部存储文件格式,Android中的数据储存之文件存储
  3. CDN 二级回源实现
  4. ERROR: No matching distribution found for onnxsim
  5. VS2010 MFC exe独立系统环境运行
  6. Log 日志的使用与重要性
  7. 计算机活动感悟怎么写,计算机教学心得体会范文五篇.doc
  8. MYSQL索引和权限管理
  9. html+css+js实现小游戏flybird(完整版)
  10. ln 硬链接和软链接
  11. idea添加注释模板
  12. 机器学习实例-决策树和随机森林预测员工离职率
  13. 操作系统的基本特征、区别及功能
  14. (转)走进全球CTA领导者:元盛资本(Winton CapitalManagement)
  15. java毕业生设计新能源汽车租赁管理系统计算机源码+系统+mysql+调试部署+lw
  16. oracle无法加载库单元,PLS-00907: 无法加载库单元 是什么错误啊??
  17. 串级PID控制原理-1
  18. 机器学习----维数灾难
  19. VMware配置虚拟机网络
  20. 新手C语言之删除数组中的空格笔记

热门文章

  1. Windows 技术篇-本地组策略编辑器添加模板方法,设置chrome浏览器本地组策略演示
  2. python计算某个数的阶乘
  3. 【Latex】引用文献时et al缺少逗号
  4. SQL查询某一字段重复的数据
  5. AMD显卡安装Pytorch
  6. MCU常见的操作系统介绍
  7. Photo Effects Pro for mac(照片滤镜工具)
  8. MTK 驱动---(12) memory的操作流程
  9. CMS收集器几个参数详解 -XX:CMSInitiatingOccupancyFraction, CMSFullGCsBeforeCompaction
  10. sim卡没坏但苹果手机无服务_苹果 iPhone 突然出现“无 SIM 卡,该怎么办?