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。这是一个由社区开发的第三方工具。
给出尝试思路如下:
- 下载最新版 SQL Server 2019 CTP 2.3 并建立一个 SSAS Tabular 项目。正如上所述,目前微软尚未提供任何一种可以体验 calculation group 特性的编辑工具。
- 使用 Tabular Editor 来打开上述项目模型文件,通过 Tabular Editor 的能力来创建 calculation group。
- 部署发布项目。
- 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/