Excel120 在 3月初随着SQLBI.com的改版,也进行了学习补充,并就最新的Power BI学习路线图做了发布。本文发布为增强版,对之前的内容做一个更详尽的说明。
DAX级别划分
如果将PowerBI DAX学习者比作修行炼的忍者,则可以分为三个级别:
Power BI只要拖拽字段就可以实现可视化仅仅是表象,在其背后的 Vertipaq 引擎提供更加强大的动力支持;一旦开始写度量值就会一头雾水,而限于国内资料很少,大部分国内图书仍然是带大家入门,要解决实际业务的复杂问题并不容易。
如果真正度过第一个坎,便可以有以一当十之感觉,曾经一度迷恋Excel的公式的灵活的强大以及可视化的灵活多样甚至一去不复返了,这是一种变革性的魔力。
即使完全掌握了DAX的使用,而对于如何帮助实际企业完成数字化转型,进一步讲就是从业务中发现真正的指标(index),一旦发生变化如何驱动行为,以及如何在业务中计算其度量值(Measure),最终形成一套标准化指标体系(Metric)依然是个难题,因为在这部分甚至不是一个人能决定或完成的。虽然这表面与Power BI DAX无关,但Power BI DAX也许是帮助在业务中实现这些的基础,忘掉技术,从头再来。
DAX初学者
DAX初学者,刚刚进入DAX世界直到可以写简单的DAX表达式处理问题。
在这个阶段的正面表现包括:
- 惊讶于DAX的能力和使用方式与Excel是那么的不同
- 可以使用 SUM , MAX , VALUES , DISTINCTCOUNT 等函数
- 理解了行上下文与筛选上下文
- 理解了上下文转换
- 理解了筛选的传递
- 可以使用 FILTER( ALL( T ) , T[C] = X ) 结构
- 可以使用时间智能函数,如:DATEADD等
- 可以使用简单的分组函数,如:SUMMARIZE等
在这个阶段的制约表现包括:
- 不理解CALCULATE所有执行细节流程与先后顺序,因此无法自信于自己的公式逻辑
- 不理解迭代器这种偏技术的说法
- 不知道SUM是SUMX的变形
- 不知道VAR的早期绑定或晚期绑定
- 无法处理多对多的关系以及不知道扩展表原理
- 有时会遇到产生循环依赖的错误不知道咋回事
- 遇到RANKX会头晕
- 没开始使用DAX Studio
这类朋友通常希望Power BI能想他理想地一样美好,但随着业务的复杂提升,往往开始无法满足这个心愿。有一部分朋友会选择继续晋升到忍者阶段。
DAX忍者
DAX忍者,掌握了数据建模并可使用DAX处理各种实际问题。
在这个阶段的正面表现包括:
- 可以使用时间智能类计算
- 可以实现参数表
- 可以实现使用静态分组
- 可以实现ABC分析
- 理解了扩展表
- 正确使用VAR
- 使用ADDCOLUMNS( VALUES( T[C] ) , "NewColumn" , << expression >> )
- 广泛使用DAX表函数
- 使用DAX Studio
正是因为这些正面表现,使得这个阶段的能力可以处理很多在传统Excel中无法完成的工作,并依托自己的业务能力远远不再需要依赖于IT,有种:“给我一个数据库密码,就能撬起企业数据”的赞叹。
在这个阶段的制约表现包括:
- 开始考虑性能的问题
- 开始思考 ALL 到底在做什么
- 开始意识到 基表 的概念
- 开始研究到 日期表 的原理(例如:为何不需要标记为日期表)
- 开始完整理解 CALCULATE 的完整执行顺序
- 如何测量DAX的性能
- 开始考虑如何做整体建模
- 开始使用 TREATAS
这些疑惑的解除往往会寻求在<
DAX禅师
因为我不是DAX禅师,所以不知道怎么定义,但我希望禅师是这样的,也许和SQLBI有些类似。
DAX禅师,精通了DAX圣经及性能优化,对DAX各处细节了如指掌,分享并帮助他人成长。
在这个阶段的正面表现包括:
- 理解Power BI底层Vertipaq引擎工作原理
- 理解FE(公式引擎)与SE(存储引擎)的特性
- 理解应该如何让FE与SE支持DAX运行得更好
- 理解并能优化数据模型
- 可以用DAX实现数据模型能支持的所有业务问题
- 可以量化测试DAX公式的性能并找到瓶颈
- 可以理解Vertipaq的逻辑查询计划与物理查询计划
- 可以理解SE对Vertipaq的查询
- 能够对DAX公式做性能优化
达到这些级别的人,例如SQLBI的大师会发出这样的感慨:
We started learning DAX in 2010 and we are writing this book in 2015. Unbelievably, it took us five years to master the code of DAX and of the engine, with a lot of discussions and meetings with the development team in the meantime.
Doing that is still hard for us, too.
-- DAX圣经 第十一章末
大师的意思是:(添油加醋版)
别看表面上我们很牛,我们从2010年就可以搞这个了(在此前已经是SQL方面的多年用户),搞了5年才说自己掌握了DAX以及底层机制,也才写出了这本书,这些年不知道因为这么多坑找了微软开发组多少次去和他们撕,开了多少会来搞清楚这些问题,哎,能读到这书,只要多读几次,比我们都幸运。如果你感觉难,那太正常了,我们现在都仍然觉得难呢。
经过对大师博客、文章以及书籍的认真学习,体会到他们应该在思考包括但不限于:
- 把DAX的内容更加体系化和简单化地揭示出来,他们不断有著作和培训视频诞生
- 开发出可以辅助的工具
- 更广泛的传播给其他人
- 帮助到所有遇到DAX麻烦的人
- ...
再有就是我也领悟不到的东西了。很难想象他们从那个2010年,应该是Excel 2010的Power Pivot开始的,看到现在的Power BI,真心不会去用Excel 2010的Power Pivot。
学习路线图
PowerBI的老伙伴都知道,学习PowerBI的问题最终会归结为学习DAX的问题。而DAX存在于微软的三套工具中,他们分别是:
- Power BI系列(包括Power BI Desktop以及Power BI服务)
- Excel PowerPivot
- SQL Server Analysis Service
这些工具的对象用户略有不同,包括:
- 从PowerBI开始接触整个体系,一般是数据建模分析人员。
- 从Excel PowerPivot开始接触整个体系,一般是Excel用户,如:财务。
- 从SSAS开始接触整个体系,一般是IT技术人员。
下面分别说明SQLBI更新的学习路线图:
如果从PowerBI开始
如果从Excel开始
如果从IT技术(SSAS)开始
SQLBI.COM 学习路线图参考:https://www.sqlbi.com/guides/dax/
强烈建议从Power BI开始。注意:而不是Excel PowerPivot。
重点书籍
在学习路线图中陆续出现了几本图书,它们的学习顺序大致为:
其中,免费图书为:
下载地址:https://aka.ms/Cj3zc4
其中,免费视频为:
https://www.sqlbi.com/p/introducing-dax-video-course/
另外,大部分图书的英文电子版已共享于Excel120 QQ群文件。
Power BI DAX 自我测评
对于有一定DAX基础的伙伴,建议可以可以先评估自我的Power BI DAX水平:
或
点击答题
提交您的Email地址或加入Excel120交流群,可以收到一份详尽的试题详解:
根据详解中给出了考点来明确自己存在的薄弱环节,再返回学习书籍。如果没有获得这个答案,可以关注Excel120留言索取
终极学习法
如果想彻底学会一件事物,就要彻底地学。如何才算彻底?穷举式地全部研究(而不是看)完。
对于一项技术,正如SQLBI大师所言,越研究越是坑,能爬出来就更加开朗。如果说有捷径的话,就是精读有限的被斟酌过最多次的书。什么叫斟酌,就是里面的每个用词都仔细地考虑过,所以作者必然是操作过所有细节的,以<
例如,对于 ALL 这个函数的解释,微软的DAX文档是这样解释的:( 阅读原文 )
Returns all the rows in a table, or all the values in a column, ignoring any filters that might have been applied. This function is useful for clearing filters and creating calculations on all the rows in a table.
中文是:
返回表中的所有行或者返回列中的所有值,同时忽略可能已应用的任何筛选器。 此函数可用于清除筛选器并对表中的所有行创建计算。
看一个例子,如果 DimDate表 有2556条记录,那么 CountRows( DimDate ) 返回2556条记录,如果与 DImDate 关联的 FactSales 在其中的1096天有销售记录,那么以下3个DAX表达式结果应该是多少:
- Calculate( CountRows( DimDate ) , FactSales )
- Calculate( CountRows( DimDate ) , All( FactSales ) )
- Calculate( CountRows( DimDate ) , Filter( All( FactSales ) , true ) )
答案是:公式1返回1096,公式2返回2556,公式3返回1096。请思考为什么?
DAX圣经中给出的答案在:Page 444。但书中第一次提及ALL的使用规则是在:Page 92。关于对ALL的英文描述包括:
- Return all rows ... 中文是 返回所有行
- Remove filters ... 中文是 移除 筛选器
- Ignore filters ... 中文是 忽略 筛选器
如果您仔细考究它们是有严重区别的:
- 返回所有行不意味着筛选器被移除了,可能是ALL的特殊性,可能筛选器依然存在,筛选器会影响其他计算。
- 移除筛选器,就是这个筛选器没了,没了后那会不会返回内容,没了的话那别的计算也不会再受影响。
- 忽略筛选器,就是计算过程中对此视而不见,忽略的潜台词就是依然存在,并未移除,那别的计算会继续受到影响。
怎么样?有没有凌乱但有很细微的差异的感觉。
这里列举微软文档和SQLBI的说明,就是为了比对,官方文档的记载可能真没有考虑到这么细致;而SQLBI的书中则在每一个必要的环节都有所顾及,而如果是翻译的话(或者不加强调的用白话描述),能够在合理的地方做出这样精准的描述恐怕真的是太难了。
因此,研习英文版的DAX圣经是非常有必要的。
如果还有余力,建议研习的著作包括:
最重要的一件事情是,您应该关注: