PowerBI 时间智能终极奥义,用 WTD 练手

2020-06-04 11:02:16 浏览数 (1)

单纯讲解时间智能函数犹如盲人摸象,不见全貌,更不见本质。 我们之前写过很多关于时间智能函数的文章,但文本将是最为本质以及最重要的。本文属于 BI佐罗 PowerBI VIP 线下培训部分抽取。

本文不具体讲解任何一个时间智能函数,但通过本文的学习,你将可以驾驭所有时间智能函数,因为您将理解其更加本质的内容,全网首发。

时间智能的逻辑本质

准确讲,时间智能并不是时间智能,应该叫:日期智能。为了精确地描述,下面统称日期智能。

其逻辑本质是一根日期轴,如下:

从日期角度分析问题的逻辑本质是:给定一段日期区间,并计算该日期区间下的指标

通常来讲,在计算指标时,都会有一段已有的日期区间作为上下文(筛选环境),但在实际计算中,我们需要对已有的日期区间进行变换。例如:对于任何一个日期点,都可以对它计算 MTD 或 YTD,其逻辑本质是将一个日期点扩展成为一段更长的日期区间。

更准确地来考察一段日期区间,不难看出:

  • 最短的日期区间,是一个点,起点日期 d1 与终点日期 d2 是重合的。
  • 起始点非重合的日期区间是整数点连续的。 含义是其连续性体现在整数上,如: 1月1日…1月5日是连续的 5 日。

为了驾驭日期维度的计算,我们需要掌握对日期的逻辑变换核心规则:

  • 第一,移动一段日期区间
  • 第二,缩放一段日期区间
  • 第三,移动并缩放一段日期区间的连续变换

下面专门来讨论这三种情况。

移动日期区间

需要移动日期区间的业务场景包括:对一段日期区间移动到其去年同期或上月同期等。

逻辑本质如下:

作为 DAX 引擎的设计者应该给业务人员一种便捷的方式,让日期区间可以得到便捷的移动。例如:

代码语言:javascript复制
KPI.PY = CALCULATE( [KPI] , DATEADD( Dates[Date] , -1 , YEAR ) )

其中,DATEADD 完成了移动日期区间的动作。不管您学习了哪些日期智能函数,应该注意其逻辑本质。

缩放日期区间

需要缩放日期区间的业务场景包括:MTD,QTD,YTD一般是放大;而月初/末,年初/末是缩小等。

逻辑本质如下:

作为 DAX 引擎的设计者应该给业务人员一种便捷的方式,让日期区间可以得到便捷的缩放。例如:

代码语言:javascript复制
KPI.YTD = CALCULATE( [KPI] , DATESYTD( Dates[Date] ) )

其中,DATESYTD 完成了缩放日期区间的动作。不管您学习了哪些日期智能函数,应该注意其逻辑本质。

移动和缩放日期区间

移动和缩放日期区间是结合前两者进行连续性操作,如下:

代码语言:javascript复制
KPI.YTD.PY =
CALCULATE(
    CALCULATE( [KPI] , DATESYTD( Dates[Date] ) ),
    DATEADD( Dates[Date] , -1 , YEAR )
)

到这里,其实就理解了关于日期智能函数的所有逻辑本质。

接下来,我们需要根据实际业务场景来组合这些变换

考一考

下面的题目,如果您可以全部做对,则表示您对日期智能函数有了熟练的理解。请听题:

【问题一】日期智能函数需要一根日期轴,应该用谁来提供?

  • A 日期表
  • B 任意日期列

【问题二】日期智能函数可以变换日期区间,为了清除外部其他日期区间的影响,需要:

  • A 用 ALL 清除外部筛选
  • B 用 REMOVEFILTERS 清除外部筛选
  • C 不用管

【问题三】如果订单表有订单日期和发货日期,需要按不同日期计算销售额,应该建立几个日期表:

  • A 一个
  • B 两个

【问题四】NEXTDAY 是日期智能函数吗?它返回的是值还是表?

  • A 值
  • B 表

【问题五】某个闰年的2月29日的去年同期(DATEADD(…,-1,YEAR))是哪一天?

  • A 空
  • B 2月28日
  • C 3月1日
  • D 报错

【问题六】某个闰年的2月29日的上月同期(DATEADD(…,-1,MONTH))是哪一天?

  • A 1月29日
  • B 1月28日
  • C 1月31日

【问题七】某个闰年的2月29日的上月同期(DATEADD(…,-1,MONTH))是哪一天?

  • A 1月29日
  • B 1月28日
  • C 1月31日

【问题八】2020 年 5 月已过 13 日,MTD 的去年同期是哪段日期?

  • A 2019.05.01 到 2019.05.13
  • B 2019.05.01 到 2019.05.31

上面 8 个问题很常见,都是初学者容易提出的问题,你可以通过试验来验证答案。(将在直播中一起分析)

实践 WTD 计算

在默认的日期智能的计算中,并不包括 WTD 的计算,虽然有很多种实现方法,这里给出最简单的一种,如下:

代码语言:javascript复制
KPI.WTD =
CALCULATE(
    [KPI] ,
    DATESINPERIOD( '日期'[Date] , MAX( '日期'[Date] ) , - WEEKDAY( MAX( '日期'[Date] ) , 2 ) , DAY )
)

周和月,周和年的结构都不同,周是有固定的 7 天的,因此,通过本文的学习,我们可以这样构建逻辑结构如下:

  • 选择日期区间的最后日期作为参考点日期
  • 计算该日期的星期几
  • 缩放该日期到周一

有的伙伴可能会问:MAX( ‘日期’[Date] ) 用了两次,如果使用 VAR 建立一个变量就可以节省一次计算。从表面上,看上去是这样的,但实际上 DAX 引擎是一个聪明的引擎,即使按照这里的重复两次 MAX 的写法,DAX 引擎也会把它自动优化掉。当然,不同的案例和场景要看具体的 DAX 公式。这里仅仅是作为一个完整的补充。

总结

为了完全驾驭时间智能,本质上,首先学习的不应该是时间智能函数,而是应该理解在分析的时候,分析师需要用逻辑来思考业务问题,而不是陷入一堆 DAX 函数。从学习 DAX 到超越 DAX,达到更加逻辑的状态,再回到 DAX 来进行运用就会有一种豁然开朗的感觉。

任何一份报告的任何一个图表都需要对日期进行控制,对日期进行控制就需要:

  • 设置日期区间
  • 移动,缩放或移动且缩放连续变换一段日期区间

完。驾驭日期智能函数的本质在于:对一段日期区间(日期轴)进行移动或缩放或相结合的连续变换,仅此而已

0 人点赞