我们之前写过很多关于时间智能函数的文章,但文本将是最为本质以及最重要的。
本文不具体讲解任何一个时间智能函数,但通过本文的学习,你将可以驾驭所有时间智能函数,因为您将理解其更加本质的内容,全网首发。
时间智能的逻辑本质
准确讲,时间智能并不是时间智能,应该叫:日期智能。为了精确地描述,下面统称日期智能。
其逻辑本质是一根日期轴,如下:
从日期角度分析问题的逻辑本质是:给定一段日期区间,并计算该日期区间下的指标。
通常来讲,在计算指标时,都会有一段已有的日期区间作为上下文(筛选环境),但在实际计算中,我们需要对已有的日期区间进行变换。例如:对于任何一个日期点,都可以对它计算 MTD 或 YTD,其逻辑本质是将一个日期点扩展成为一段更长的日期区间。
更准确地来考察一段日期区间,不难看出:
- 最短的日期区间,是一个点,起点日期 d1 与终点日期 d2 是重合的。
- 起始点非重合的日期区间是整数点连续的。含义是其连续性体现在整数上,如:1月1日...1月5日是连续的 5 日。
为了驾驭日期维度的计算,我们需要掌握对日期的逻辑变换核心规则:
- 第一,移动一段日期区间
- 第二,缩放一段日期区间
- 第三,移动并缩放一段日期区间的连续变换
下面专门来讨论这三种情况。
移动日期区间
需要移动日期区间的业务场景包括:对一段日期区间移动到其去年同期或上月同期等。
逻辑本质如下:
作为 DAX 引擎的设计者应该给业务人员一种便捷的方式,让日期区间可以得到便捷的移动。例如:
KPI.PY = CALCULATE( [KPI] , DATEADD( Dates[Date] , -1 , YEAR ) )
其中,DATEADD
完成了移动日期区间的动作。不管您学习了哪些日期智能函数,应该注意其逻辑本质。
缩放日期区间
需要缩放日期区间的业务场景包括:MTD,QTD,YTD一般是放大;而月初/末,年初/末是缩小等。
逻辑本质如下:
作为 DAX 引擎的设计者应该给业务人员一种便捷的方式,让日期区间可以得到便捷的缩放。例如:
KPI.YTD = CALCULATE( [KPI] , DATESYTD( Dates[Date] ) )
其中,DATESYTD
完成了缩放日期区间的动作。不管您学习了哪些日期智能函数,应该注意其逻辑本质。
移动和缩放日期区间
移动和缩放日期区间是结合前两者进行连续性操作,如下:
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日
【问题七】2020 年 5 月已过 13 日,MTD 的去年同期是哪段日期?
- A 2019.05.01 到 2019.05.13
- B 2019.05.01 到 2019.05.31
上面 7 个问题很常见,都是初学者容易提出的问题,你可以通过试验来验证答案。
实践 WTD 计算
在默认的日期智能的计算中,并不包括 WTD 的计算,虽然有很多种实现方法,这里给出最简单的一种,如下:
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 来进行运用就会有一种豁然开朗的感觉。
任何一份报告的任何一个图表都需要对日期进行控制,对日期进行控制就需要:
- 设置日期区间
- 移动,缩放或移动且缩放连续变换一段日期区间