跳至正文

Dax Guide-2-为分析而“准备”与Column计算列

标签:

正在准备一个全新内容,从而验证喜乐君分析框架的普适性。全新视角看DAX:课程 博客同步要点:

希望进一步了解,欢迎观看系列视频:

【B 站课堂】DAX 别裁新解 https://www.bilibili.com/cheese/play/ss8780?bsource=link_copy
该视频系列在2024年7月第三遍录制,增加了SQL 对比,增加了诠释深度

最新版本介绍视频 (在线播放)202407 V3

一、分析计算的两个阶段

为什么 DAX 难以理解?一个关键原文是,它严格区分了两个计算阶段,甚至为此设置了两个入口、两个标识符,这是为了兼容数据计算和可视化渲染两个更宏大的阶段,但无形中让简单的问题也变得复杂。

相比之下,SQL是编程语言,它天然有优先级概念,所以在select查询中,可以同时出现year函数和sum函数。

实例:各年度的销售数量总和

但是在DAX中,类似的逻辑就会出错。为此,我们必须明确地区分何为“问题阶段”的计算,何为预先在数据表明细行的计算——或者说,哪些是关于聚合的,哪些是为聚合而做的准备。

在DAX中,于是就有了Calculated Column的概念,以新功能的方式,强制指定它的计算必须相当于明细表而有意义,在它之后,才能完成问题阶段的分组聚合。正因为此,calculated Column的计算结果,可以在问题中承担任意角色——不管是筛选、分组字段,还是作为聚合对象。

二、DAX的计算列语法

也就是说,DAX的Calculated Column,以及为此单独设计的入口,强调了优先级的先后次序,弥补了函数语言先天性不足。

如下所示,可以先定义一个计算列,它会先于summarizecolumn而计算。

如果把上面的Column改完VAR变量,可以吗? 如下所示,运行会出错。大家可以评论一下为什么。

三、如何区分“预先计算”与“临时计算”

怎样的计算是在明细表中预先完成的,怎样是在视图中按需完成?

这是通往计算优先级的关键之一。

如果定义一个计算列,那么就会在内存引擎中预先完成,以备视图聚合需要(哪怕最后没有用到);而度量值中的“临时计算列”,则可以在聚合过程中临时完成。

喜乐君 V0.1