前言
我们已经创作了大量关于DAX的内容,比如那些关于Power Pivot和SSAS表格模型的书、博客、文章、白皮书,以及一本关于DAX Patterns的著作。还有必要再为DAX另外写一本书吗?这门语言值得花这么多精力吗?当然,我们认为答案是肯定的。
当一本书诞生时,编辑首先关心的是它的页数。这一点之所以重要,是因为页数涉及定价、管理和资源的分配等。这多少让作者有一点沮丧。事实上,每次写书时,我们都需要谨慎分配关于产品(无论是Excel Power Pivot还是SSAS表格模型)和DAX语言描述所占的资源。没有足够的篇幅让我们对DAX畅所欲言的感觉是痛苦的。毕竟,你不可能写1000页关于Power Pivot的内容,这种体量的书对任何人来说都是一场噩梦。
因此,这些年来,我们在撰写关于Power Pivot和SSAS表格模型的书的同时,也编写了一本系统阐述DAX的书,只不过它暂时被封存。现在,我们决定打开封印,不再纠结摘录哪一部分内容——我们将介绍关于DAX的所有细节,不做任何删减,这就是本书的由来。
本书不介绍如何创建计算列,不告诉你在哪个对话框中可以设置哪些属性。因为这不是一本手把手教你使用Visual Studio、Power BI和Power Pivot的书。相反,它将深入介绍DAX语言,从入门开始一直到非常技术化的细节,来指导你如何优化自己的代码和模型。
在创作过程中,我们对它的每一页都爱不释手,无数次回顾这些内容,以至于可以倒背如流。每当我们认为有重要的内容要补充时,就会继续添加内容。这让本书的页数只增不减,因为每一页都是有价值的。在此期间,我们加深了对DAX的理解并且享受整个创作过程。
但还有一件事情需要说明,为什么你需要这样一本关于DAX的书?
在你第一次使用Power Pivot或Power BI之后可能就有了这种想法。拜托,你不是一个人,我们第一次使用之后也产生了这个困惑。DAX看起来太简单了!它和Excel函数是如此相似!而且,如果你学习过其他编程语言或查询语言,那么你可能已经习惯参照语法实例、套用已经掌握的思维模式来学习一门新的语言。这些都是我们在学习DAX过程中犯过的错误,希望你不要重蹈覆辙。
DAX是一门强大的语言,支持这门语言的分析工具正在不断增加。但在强大的背后,它的一些原理很难通过归纳法(从具体实例推导出普遍规律的一种方法)来理解。例如,对计值上下文(Evaluation Context)的理解需要用到演绎推理:先接触理论本身,再通过案例加深对理论的理解。我们知道很多人都不习惯这种学习方式,他们更喜欢在实践中学习,即先研究如何解决具体问题,再通过不断的练习和积累,归纳出公式背后的原理。如果你也希望使用这种方式学习,那么本书可能不适合你。我们另有一本书:DAX Patterns,它是一本面向实战的案例集,不包含公式原理的解释,也不会告诉你为什么公式写成这样效率更高,它适合让你以直接套用的方式解决实际问题。但本书的目的是让你真正掌握DAX。基于此,本书中所有的案例都是为了解释DAX语言的行为,而非解决特定问题。如果你发现书中的某些公式恰好可以应用到你的模型里,那么恭喜你。但请记住,这只是意外之喜,并非案例的本意。最后,请务必留意书中的注解,以确保理解案例中的代码所包含的陷阱。出于讲解的目的,书中使用的公式源码通常并非最佳实践。
希望你能和我们一起享受这段学习DAX的美妙旅程,就像当初我们写这本书时那样。
本书受众
如果你只是偶尔会使用DAX,那么本书或许不是最佳选择。市面上已经有很多书提供了DAX相关工具和语言本身的简明介绍,它们可以帮助你从零开始达到基础级别的DAX编程水平。我们对此非常了解,因为我们也写过类似的书。
而如果你是抱着认真的态度学习DAX,想要了解这门优美语言的所有细节,那么本书就是为你准备的。如果这是你学习DAX的第一本书,那么请不要期望太早领悟那些高级概念。建议你首先通读全书,等到积累一些经验后再重读那些最复杂的章节,那时你会对它们有更清晰的了解。
不同职位、不同目的的人都可以从DAX中获益,Excel用户可以利用DAX操控Power Pivot数据模型,商业智能(BI)专家需要在不同规模的BI解决方案中编写DAX代码,非专业Power BI使用者需要在自助BI模型中编写DAX公式。不同的人群在本书中都能找到适合自己的内容。某些内容(特别是性能优化部分)更适合BI专家,因为用于优化DAX度量值的知识具备比较高的技术性;但我们认为Excel用户同样需要了解DAX表达式之间的性能差异,以便获得最佳的模型运行效果。
最后,你需要不断从本书中学习,而不能仅仅停留在阅读阶段。我们保持入门部分的内容的通俗易懂,并遵循从零开始学DAX的逻辑路径。然而,当其中涉及的概念开始变得复杂时,我们将不再试图简化它,而是回归真实。DAX不是一门简单的语言,掌握它和理解引擎的每处细节花费了我们多年的时间,不要奢望随手翻翻本书就能明白全部内容。你在阅读本书时要高度集中注意力。作为回报,我们提供了关于DAX各个方面的内容,且这些内容是前所未有的,以助你成为一名真正的DAX专家。
准备知识
我们希望本书读者在Power BI和数据分析方面具备一定的基础知识,如果你对DAX有过一些接触,这对你有好处,它能帮助你更快地阅读本书第一部分内容。当然,了解DAX不是必需的。
本书部分内容引用了MDX和SQL代码,但你不必预先了解这些语言,因为它们只是反映不同表达式之间的区别,即使你不了解这些代码也没有关系。这意味着那些特定主题不是为你准备的。
在本书最复杂的高级内容部分,我们介绍了并行计算、内存访问、CPU使用,以及其他过于高深、让大部分读者可能感到陌生的知识。开发人员熟悉这些内容,而Excel高级用户可能有点畏惧。不过,当涉及优化内容时,这些信息是必需的。因此,本书最复杂的部分面向BI开发人员而不是Power BI和Excel用户。然而,我们相信每个阅读过它的人都会从中受益。
本书编排
本书在内容设计上遵循合理的逻辑顺序,从入门内容逐步深入到复杂内容。每章的内容在撰写时都基于之前内容被完全理解的基础之上;几乎不会重复前面介绍过的概念。正因如此,我们强烈建议读者在首次阅读本书时采用从头至尾的方式系统学习,不要提前跳到复杂章节。
读过一次之后,它就可以成为你学习DAX的参考书。例如,如果你对ALLSELECTED函数的原理不是很明白,则可以直接翻到讲解这个函数的那章打消疑问。不过,在缺少对之前内容理解的情况下,阅读该部分可能无法达到预期效果,甚至会遇到更糟糕的情况:产生片面或错误的理解。
以下是各章节内容概览。
? 第1章是对DAX的简要介绍,其中有些内容是专门针对已经有其他编程语言基础的用户,比如SQL、Excel或MDX。本章没有引入任何新概念,只给出你可能已经知道的,一些关于DAX和其他语言差异的提示。
? 第2章介绍DAX语言的概况,涵盖计算列、度量值、错误处理函数等基本概念,并列出DAX的大部分基础函数。
? 第3章专门介绍基础表函数。DAX的许多函数都使用表作为参数或返回表作为结果。本章内容涵盖最基本的表函数。高级表函数将在第12章和第13章中介绍。
? 第4章专门介绍计值上下文。计值上下文是整个DAX语言的基石,本章连同第5章,是整本书最重要的内容。
? 第5章只介绍两个函数:CALCULATE和CALCULATETABLE。它们是DAX中最重要的函数,是否理解计值上下文将直接决定你能否用好这两个函数。
? 第6章介绍变量。在本书的案例中使用了大量的变量,本章专门介绍它们的语法并解释如何使用变量。当你在接下来的章节中看到大量使用变量的例子时,本章内容将是非常有参考性的。
? 第7章介绍迭代器和CALCULATE函数:二者是“天作之合”。学习如何使用迭代器,以及上下文转换,可以充分发挥DAX的强大功能。本章中会介绍几个有助于理解如何利用这些工具的例子。
? 第8章深入阐述时间智能计算,包括年初至今、月初至今、去年同期、基于周的时间段和自定义日期表等常用计算。
? 第9章专门介绍DAX中引入的最新特性:计算组(Calculation Groups)。计算组是非常强大的建模工具。本章介绍如何创建和使用计算组,以及计算组的基本概念,并展示了一些示例。
? 第10章介绍筛选上下文的更高级用法,比如数据沿袭、对筛选上下文的检查及编写高级公式的有用工具。
? 第11章介绍如何对层级结构执行计算,以及如何使用DAX处理父/子结构。
? 第12章和第13章介绍对编写查询和/或执行高级计算都很有用的高级表函数。
? 第14章进一步介绍计值上下文的知识,并在扩展表理论的帮助下介绍诸如ALLSELECTED和KEEPFILTERS之类的复杂函数。本章内容属于高级内容,揭示了复杂DAX表达式的大部分秘密。
? 第15章介绍如何管理DAX中的关系。实际上,借助DAX,任何类型的关系都可以在数据模型中被设置。本章介绍分析型数据模型中常见的多种类型的关系。
? 第16章介绍几个用DAX解决的复杂计算案例。这是关于DAX语言的最后一章,本章有助于读者发现解决方案和产生新的想法。
? 第17章详细描述VertiPaq引擎,它是运行DAX模型时最常用的存储引擎。了解这一点,对于学习如何在DAX公式中获得最佳性能至关重要。
? 第18章基于第17章的内容,介绍数据模型级别可用的优化手段。读者会在本章学到何时规范化模型,如何减少列基数,如何设置关系和使用最少的内存以在DAX中获得最佳性能。
? 第19章介绍如何读懂查询计划,以及如何借助DAX Studio和SQL Server Profiler等工具来评估DAX查询的性能。
? 第20章基于之前章节介绍的优化知识,介绍一些技术解决方案,本章首先展示示例公式,然后评估它们的性能,最后解释并给出优化后的公式。