数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你
https://zhuanlan.zhihu.com/p/64422393
经常有朋友提出一个问题,然后我给出一个DAX之后,TA又不是很理解,反复多次沟通才能把一个表达式讲清楚。或者TA自己写了一个度量值,可是对输出结果无法理解:我想要的是A,为什么出来的是B?
为了帮助大家快速理解一个相对复杂的DAX,我把平时使用的方法拿出来分享如下。
为了介绍的简洁清晰,以及大部分人的可理解性,本文的DAX并不算复杂,重要的是理解的步骤和思路。(我理解的复杂DAX就是看起来比较长的、经过多层函数嵌套的、计算逻辑较难理解的表达式)
DAX都应该有一个具体的应用场景,否则分析就没有意义。
假设已有一个订单表,需要匹配每个订单的产品对应的采购成本金额;而成本表中的每种产品的采购成本是随着时间变动的,成本生效以后,该产品销售订单的成本随之变化,两个表格结构如下图,
问题看似简单,其实需要匹配几个条件,要匹配产品名称、订单日期对应的成本生效区间。转换为数据分析语言,其实就是计算该产品的小于等于订单日期的最近一个成本生效日期对应的采购成本。
在订单表上"新建列",用DAX编写如下,
单位成本 =
CALCULATE(MIN('成本表'[成本金额]),
TOPN(1, FILTER(ALL('成本表'), '成本表'[生效日期]<=
EARLIER('订单表'[订单日期])&&
'成本表'[产品名称]=EARLIER('订单表'[产品名称])),
'成本表'[生效日期] ) )
然后每笔订单对应的单位成本就被计算出来了,
当然这篇文章并不是为了匹配成本,而是理解这个DAX表达式。
对DAX熟悉的人,看到上面这个表达式并不难,但是如果是接触DAX不是很久的同学,可能并没有那么容易理解。
下面进入正题,通过以下几个步骤来快速理解上述的DAX。
一 、格式化DAX
格式化就是对DAX进行合理的换行和缩进,表面上看起来更加简洁美观,更易于阅读,其实最重要的是通过格式化可以更清晰的找出该表达式的设计逻辑和计算逻辑。
上述的表达式进行格式化处理以后,变成了这样的,是不是很清晰很多呢。
当然当你看到的DAX已经是格式化的写法,就没有必要进行这一步了。
如果是你自己编写的DAX,强烈建议从一开始就养成按格式书写的好习惯,为以后进行数据分析编写更复杂的DAX打下基础。
上面这个表达式相对简单,如果比这复杂几倍,嵌套更多层的表达式,如果不进行格式化,想看懂其结构都非常困难,更别说理解其逻辑了。
二 、对DAX从内层向外逐层分解,不理解时通过输出,来查看其计算结果。
通过上面格式化后的表达式,可以看出最内层的算是EARLIER函数,然后是FILTER函数的筛选表,之外又套了一个TOPN函数,最后由CALCULATE函数返回最终结果。
理解DAX函数的用法和逻辑,除了看关于该函数的介绍文档,最直接的就是查看该函数的计算结果,下面就以一个实例来看看该DAX每一步的输出内容。
以2月8日手机订单对应的成本为例,来理解这个表达式是如何计算出单位成本为1300的。
第1层 | EARLIER函数
EARLIER函数之前介绍过(EARLIER 函数 | PowerBI星球),比较简单,返回当前行对应的参数列,实质就是返回本行和参数列交叉的单元格。
那么EARLIER的计算结果如下,
EARLIER('订单表'[订单日期])返回:2018-2-8
EARLIER('订单表'[产品名称]返回:手机
第2层 | FILTER函数
有了第1层的结果,FILTER函数的表达式变成了,
FILTER(ALL('成本表'), '成本表'[生效日期]<= DATE(2018,2,8)&&'成本表'[产品名称]="手机")
该表达式将筛选成本表中产品名称为手机,并且生效日期早于或等于2018年2月8日的数据,通过新建表,该表达式的输出结果如下:
回的正是按上述条件的筛选表。
第3层 | TOPN函数
FILTER函数的计算结果返回了早于订单日期的所有行,为了找出最近的一次生效日期,使用TOPN函数返回按生效日期排序的第1行,利用上一步的计算结果,TOPN的表达式变为,
TOPN(1,'表1','表1'[生效日期])
同样使用"新表"查看输出结果,
把小于订单日期的最近生效日期的所在行给筛选出来了。
第4层 | CALCULATE函数
经过TOPN的筛选,已经把成本表筛选的只剩下一行,在这一行中找采购单价已经非常简单了,表达式变为,
CALCULATE(MIN('表2'[采购单价]),'表2')
这里用了MIN函数,实际上用MAX函数也是一样的,因为只有一个值,最小值和最大值是相同的。
因为CALCULATE只能返回值,为了在表中查看输出结果,所以外面套一个{},强制把单个值变为表,结果如下:
得出了2月8日手机的采购成本价格1300元。
以上对几个嵌套函数的拆解,为了演示输出结果,所以生成了表1、表2、表3等三个中间表,实际上原表达式一气呵成,并不需要中间表,一次性输出最终数据。
三 、复盘总结各函数的用法
通过以上的拆解,应该能完全理解上述表达式的计算过程了,但我们不能仅理解了这个表达式,更是要通过整体的计算逻辑,能举一反三,掌握其中每个函数的用法,所以每次拆解以后,应该整体上进行复盘,思考一下表达式中主要函数的用法以及返回的结果是很必要的。
比如上述表达式中,至少可以总结出这些,
- EARLIER返回当前表的当前行与参数列交叉的单元格数据;
- FILTER函数根据第二个参数的筛选条件来筛选第一个参数表,返回的是一个表;
- TOPN函数返回参数表中按第三个参数排序的前N行,返回的也是一个表;
- CALCULATE函数返回聚合后的一个值。
经过以上的三个步骤的层层分解和复盘,不仅知道了DAX的输出结果,而且对每一个函数的计算逻辑和过程进行了全面理解。
上述DAX虽然简单,但即使是更复杂的表达式,通过以上的方式也都可以很快理解并掌握。
总结
通过以下几个步骤快速理解一个相对复杂的DAX,
1,格式化:从整体上查看其结构,为第2步打基础;
2,从内向外层层分解:必要时输出结果查看计算逻辑;
3,分解后再整体复盘:总结每一个函数和参数的用法。
本文示例文件可通过公众号回复关键字"理解DAX"获取,业务场景来自于知识星球中一个朋友的提问,来知识星球,和我一起学习PowerBI。
数据可视化之DAX篇(十六)如何快速理解一个复杂的DAX?这个方法告诉你的更多相关文章
- 数据可视化之分析篇(六)使用Power BI进行流失客户分析
https://zhuanlan.zhihu.com/p/73358029 为了提升销量,在不断吸引新客户的同时,还要防止老客户离你而去,但每一个顾客不可能永远是你的客户,不可避免的都会经历新客户.活 ...
- 数据可视化之PowerQuery篇(六)PowerQuery技巧:批量合并Excel表的指定列
本文来源于一个星友的问题,他有上百个Excel表格,格式并不完全一样,列的位置顺序也不同,但每个表都有几个共同列,这种情况下,能不能通过Power Query把这些表格共同的列批量合并呢? 当然是可以 ...
- 数据可视化之PowerQuery篇(四)二维表转一维表,看这篇文章就够了
https://zhuanlan.zhihu.com/p/69187094 数据分析的源数据应该是规范的,而规范的其中一个标准就是数据源应该是一维表,它会让之后的数据分析工作变得简单高效. 在之前的文 ...
- 数据可视化之powerBI入门(十一)认识Power BI数据分析语言DAX
DAX是英文Data Analysis Expression的缩写,意思是数据分析表达式,从名称上就可以看出,DAX公式是用作数据分析的,事实上也确实如此,从数据分析层面认识DAX会更有助于我们理解它 ...
- 数据可视化之 图表篇(二)如何用Power BI制作疫情地图?
丁香园制作的这个地图可视化,相信大家每天都会看好几遍,这里不讨论具体数据,仅来探讨一下PowerBI地图技术. 这个地图很简洁,主要有三个特征: 1,使用着色地图,根据数据自动配色 2,只显示中国地图 ...
- 数据可视化之powerBI技巧(十一)基于SQL思维的PowerBI DAX实战
本文来自于PowerBI星球嘉宾天行老师的分享,天行老师不仅DAX使用娴熟,更是精通SQL,下面就来欣赏他利用SQL思维编写DAX解决问题的一个实战案例. 基于SQL思维使用DAX解决实战问题 作者: ...
- 【WaaCaa】一款开源科学作图/数据可视化工具 —— 诞生篇
作为一个理工男.用过了形形色色能够用于科学作图/数据可视化软件:从大学时做实验课推荐用于分析简单採集数据的 Origin; 毕业论文时用来呈现实验时序信号和离线分析脑电信号的 MATLAB.后面还发现 ...
- 数据可视化之 图表篇(四) 那些精美的Power BI可视化图表
之前使用自定义图表,每次新打开一个新文件时,都需要重新添加,无法保存,在PowerBI 6月更新中,这个功能得到了很大改善,可以将自定义的图表固定在内置图表面板上了. 添加自定义图表后,右键>固 ...
- 数据可视化之powerBI技巧(六)在PowerBI中简单的操作,实现复杂的预测分析
时间序列预测就是利用过去一段时间内的数据来预测未来一段时间内该数据的走势,比如根据过去5年的销售数据进行来年的收入增长预测,根据上个季度的股票走势推测未来一周的股价变化等等. 对于大部分人来说,这是个 ...
随机推荐
- vim改变字体和查看映射的(mapping)命令
临时修改.通过gvim Command MODE,输入如下命令即可: Linux/Unix: set guifont=Monospace\空格14 注意这里需要对空格使用\进行转义 Windows: ...
- 如何在VMware虚拟机中安装CentOS6.7系统(上篇)
之前给大家分享了在VMware中如何创建CentOS虚拟机,今天给大家分享一下如何在虚拟机中安装CentOS系统,以CentOS6.7系统为例,其他的系统版本也可以参考该教程进行类似处理,具体的流程如 ...
- 嵌入式QT开发视频教程-供参考
免费嵌入式QT开发视频教程 https://pan.baidu.com/s/1bprhJ2Z QT初级到高级编程视频教程--丁林松.rarhttp://www.jisoupan.com/share/2 ...
- vue 生成二维码+截图
链接生成二维码 1.npm安装 npm install --save qrcodejs2 2.引入 import QRCode from 'qrcodejs2' 3.生成二维码 new QRCode( ...
- HTTP Request Smuggling 请求走私
参考文章 浅析HTTP走私攻击 SeeBug-协议层的攻击--HTTP请求走私 HTTP 走私漏洞分析 简单介绍 攻击者通过构造特殊结构的请求,干扰网站服务器对请求的处理,从而实现攻击目标 前提知识 ...
- Consul入门初识
Consul Consul是一个支持多数据中心分布式高可用的服务发现和配置共享的服务软件,由HashiCrop公司用Go语言开发,基于Mozilla Public License 2.0的协议进行开源 ...
- RabbitMQ:一、入门
消息中间件 使用消息中间件的作用 解耦 削峰 异步 顺序保证 冗余(存储) RabbitMQ的特点 可靠性 灵活的路由 扩展性 高可用 多语言客户端 插件机制 多协议(主要还是AMQP) 相关概念 P ...
- curl模拟调用接口
curl模拟调用接口 1. get请求 curl -i -X GET http://url/bind/agentOnWork/v2?Sig=******* 2. post请求(带头信息以及参数) cu ...
- JDK8--01:JDK8简介
一.新特性1.lambda表达式(重点)2.函数式接口3.方法引用与构造器引用4.Stream API(重点)5.接口中的默认方法和静态方法6.新时间日期API7.其他新特性 二.特点: 1.速度更快 ...
- .NET Core 选项模式【Options】的使用
ASP.NET Core引入了Options模式,使用类来表示相关的设置组.简单的来说,就是用强类型的类来表达配置项,这带来了很多好处.利用了系统的依赖注入,并且还可以利用配置系统.它使我们可以采用依 ...