内行才能看懂的 PowerBI DAX 引擎重大更新来了

  • 2019 年 10 月 6 日
  • 筆記

2019年3月1日,在SqlBits大会上,微软宣布DAX引入一项重大更新:Calculation Group(暂且不做翻译)。这项更新将对PowerBI及SSAS均构成重要影响。为此,微软SSAS团队官方,SQLBI.com以及Chris Webb分别在各自博客记录这一内容。(后两者为SSAS领域国际顶级专家博客)

按照 SSAS 团队官方的话说,这是一项DAX本该具有却一致未有的能力。 按照 马克·啰嗦 大师的说法,之所以《DAX圣经 第二版》一直未出版,就是在等微软宣布这项DAX更新,这将写入最后一章。 按照 Chris Webb 的观点,这项更新是DAX历史上最重要的更新。

那么到底是什么功能(特性),另各位专家如此兴奋不已呢,本文将结合三方博客来介绍这一特性。

问题背景

简单直接地说,这个问题来自于 DAX度量值 的复用问题,举例如下: 现有度量值:订单销售额,订单利润,订单利润率等10个指标,它们的计算逻辑非常简单。不妨称之为基础度量值。 当我们需要这些基础度量值与一些条件关联时,就会产生新的度量值,如和时间有关的组合,包括: MTD,QTD,YTD,PY,MTD PY,QTD PY,YTD PY,PY FY,MTD YOY%,QTD YOY%,YTD YOY%等很容易就超过10个,因此,对于10个基础度量值,每个基础度量值都会与10个条件组合来派生度量值,迅速多达100个度量值。 而如果有50个度量值与20个条件来组合,就会达到1000个度量值,我们称之为无法复用导致的度量值爆炸式增长

在微软的产品中,其实有一条隐形的准则,那就是:如果用户在有规律地重复一项操作,那么有两个可能:要么有一个一键解决的方法,只是你不知道;要么就是微软缺乏了一项重要的特性。而99%的可能性是前者。 也就是用户不知道这个一键搞定的方法,例如:数据模型自动检测是对N次VLOOKUP的一键解决方案。

顺便提一句:VLOOKUP 在办公中将两个表合并为一个表,再透视基本是办公阶段Excel用法的铁律,而在BI中,直接建立数据模型的方法直接将办公的用法完全碾压,办公需要VLOOKUP,而BI却是一键解决的,因此花费大量精力去搞清楚VLOOKUP的十大技巧完全不必。

而在今天这里,却是后者,确实是微软缺失了一项在 DAX 中解决复用问题的特性。再重复一次:如何在DAX中复用复杂逻辑,不需要编写新的度量值,却可以从基本度量值派生新的度量值。怎么破?

Calculation Group

为了解决类似上述的问题,现有的DAX是无法做到的(当然,现在可以了)。微软称这项特性叫:Calculation Group。这一个只含有一列的表,列中的每个值定义了可复用的计算逻辑,称这些值叫:calculation items

这里不做中文翻译,因为该特性尚在预览阶段,以未来微软提供的中文翻译名字为准。

calculation items 可以与度量值任意结合使用,达到改变度量值已有逻辑,更准确讲,是从已有逻辑派生新计算逻辑。

一个典型的案例就是将时间维度的逻辑进行复用,形如:

时间维度案例

表名称:Time Inteligence 列名称:Time Calculation 优先级:20

对其中 calculation item 的定义如下:

可以看到,这里用到了 SELECTEDMEASURE 函数,请仔细观察上述的效果示意图,可以看出:当 calculation item 与 度量值 在一起使用时,它可以动态的修改度量值。准确地猜测(微软尚未发布官方说明),calculation item 将动态地修改度量值进行计算的筛选上下文环境,而不去管这个度量值是什么。

从 CALCULATE 的技术细节来讲,应该是在 CALCULATE 计算的上下文堆栈中,压入新的筛选器,再计算 CALCULATE 的第一个参数。(详细原理已经在Excel120的《DAX基础》中给出,不再赘述。)这里很明显会涉及到三个问题:

如何选出当前的度量值:SELECTEDMEASURE。 当前度量值的名字:SELECTEDMEASURENAME。 是否是特定的度量值:ISSELECTEDMEASURE。

上述三个新增函数就可以来解决这个问题。

还有一个问题就是如果一个基础度量值与多个calculation item同时使用,到底哪个 calculation item 先算的问题,这个由上述的优先级定义给出。

相关信息

该DAX能力目前仅仅在预览阶段的 SQL Server 2019 CTP 2.3 中存在,而且尚无任何微软官方编辑器可以编辑操作该特性,也就是说,你无法在 DAX Studio,Power BI Desktop 或 SSAS 的 SSDT 中操作或设置该特性。

该特性已经在 引擎版本1470中存在。目前我们使用的 2019年2月 版的PowerBI 引擎版本为 1465。如下:

也就是说,本文所述的特性目前看不见,摸不着,但它的确存在于最新的DAX引擎中了。

这是一个使用起来很简单的特性,但SSAS团队需要在背后做很多事情,才能确保该特性与其他DAX特性完好共存,例如:Excel是可以作为客户端来使用的;RLS的兼容;动态格式字符串;AllSELECTED等函数;Detail Rows 表达式等。

动态格式字符串

你可以想象对于一个基础度量值(如:销售额)与N个 calculation item 的结合使用,会产生 去年销售额 以及 销售额增长率 这两个不同指标,而它们一个是数字格式,一个是百分比格式,但却只有一个基础度量值,这便构成了一个矛盾。

超级复杂中国式复杂报表 中,我们给出了现有 PowerBI DAX 下的解决方案,但那并非一种原生特性,而是需要利用多种技巧。很明显,动态格式字符串的发布将更好的解决这类问题,以及更容易地创建中国式复杂报表。

动态格式字符串 特性应该会在2019的迭代中发布,我们将持续关注。

提前尝鲜

如果特别希望提前体验 calculation group 特性,确实有一个方法,那就是使用:Tabular Editor。这是一个由社区开发的第三方工具。

给出尝试思路如下:

  1. 下载最新版 SQL Server 2019 CTP 2.3 并建立一个 SSAS Tabular 项目。正如上所述,目前微软尚未提供任何一种可以体验 calculation group 特性的编辑工具。
  2. 使用 Tabular Editor 来打开上述项目模型文件,通过 Tabular Editor 的能力来创建 calculation group。
  3. 部署发布项目。
  4. PowerBI Desktop live connenction 模式连接SSAS体验。

按照意大利大师的话来说,由于Calculation Group特性的到来,即将解锁一大波DAX的新能力,具体能做到哪些,现在不好说,微软还没有对外明确公布在 Power BI 中发布该特性的时间,大师们表示需要数月甚至整年时间来研究由此带来的新玩法。

而在微软的官方博客已经能预料到由于DAX引擎一波特性的发布,已经让SSAS团队处于很大负荷的状态。这些特性包括:管理聚合(多对多);PowerBI 增量刷新;开放 PowerBI 可作为 SSAS 连接,以及今天提及的Calculation Group。

总之,尽情享用吧。

参考资料

微软SSAS团队博客: https://blogs.msdn.microsoft.com/analysisservices/2019/03/01/whats-new-for-sql-server-2019-analysis-services-ctp-2-3/

SQLBI博客: https://www.sqlbi.com/blog/marco/2019/03/01/calculation-groups-in-dax-first-impressions/

Chris Webb博客: https://blog.crossjoin.co.uk/2019/03/01/ssas-tabular-2019-calculation-groups-and-migration-from-ssas-multidimensional/