DAX设计模式(第2版)
上QQ阅读APP看书,第一时间看更新

第1章 与时间相关的计算

本章介绍4种与时间相关的计算模式。其目的是帮助你根据自己的特定需求选择正确的模式。确实,在进行时间相关的计算时,模式的选择是个难题。

首先,什么是与时间相关的计算呢?与时间相关的计算是指任何涉及时间的计算。比如期初至今(年初至今、季初至今或月初至今)相关的一组计算。这些计算从一个时间段(年、季度、月)开始并返回自该时间段开始到报告中所示日期的度量值的聚合。时间段的定义会根据你使用的是公历日历还是会计日历而存在差异。在图1-1中,你可以看到一个期初至今计算的示例,其中,YTD代表年初至今、QTD代表季初至今。

图1-1 期初至今计算的示例

这些模式还包括将特定时间段内的参数和另一时间段内的参数进行比较。例如,你可以将当月的销售额与去年同月的销售额进行比较。与时间相关的计算的另一个示例是一段时期内的移动平均,例如,12个月的移动平均可以让折线图平滑并消除对计算结果的季节性影响。4个与时间相关的模式会执行相同的一组计算。

对日历的不同定义会使模式产生不同的结果。通过查看图1-1,你已经可以理解年初至今计算的不同定义。

根据使用的是公历日历还是会计日历,日期的数值会有差异。由于对日历的定义不同,事情处理起来很容易变得非常复杂。

例如,你可能有遵循ISO标准或你自己定义的基于周的日历。在基于周的日历中,每个月从一周的同一天开始,这一年也是如此。因此,基于周的日历中的一年可能在上一个公历年开始,也可能在下一个公历年结束。此外,出于会计目的,某些日历会将一年分为13个时间段,而不是12个月。不同的日历需求是导致对与时间相关的模式进行选择的主要原因。

4个与时间相关的模式(依复杂程度递增的排序)如下所示:

● 标准时间相关的计算;

● 与月相关的计算;

● 与周相关的计算;

● 自定义时间相关的计算;

标准时间相关的计算模式利用常规的DAX时间智能函数来实现。该模式的实现基于你的日历是常规公历日历,并且你的会计日历起始于公历季度。例如,如果你的会计日历从7月1日(公历日历第三季度的开始日期)开始,则DAX时间智能函数可以正常工作。但是,如果你的会计日历从3月1日开始,则可能会出现出乎意料的计算结果。这既因为3月不是一个公历季度的开始,又因为会计日历在处理闰年方面的历史缺陷。尽管有这些限制,该模式还是易于使用和执行的,因为它依赖于标准DAX函数,并且可以与常规日期表配合使用,几乎没有要求。

其他的3个模式不使用DAX时间智能函数计算。它们使用基本的DAX函数编写,这就给以季度、月份和周定义的日历提供了更大的灵活性。这些模式需要你创建一个Date表,DAX度量值需要通过该表中的列来识别该年度的时间段。例如,你需要一个包含年份的列、一个包含季度的列、一个包含月份的列,以及其他用于简化计算的列。

此外,在检测和筛选时间段时需要考虑许多细节。事实证明,许多看起来对于人类而言很容易的计算,而对于计算机就非常复杂。当你将一个季度与上一个季度进行比较时,你需要为两个季度选择不同的天数:1月至3月的季度比4月至6月的季度短。月份也是如此:1月比2月长,但是如果要逐月进行比较,则你所需要的两个日期选择会具有不同的长度。

如果标准时间智能函数不能满足你的需求,则你需要执行其他3种模式中的一种。这3种模式都需要创建你自己的Date表。

与月相关的计算模式是最简单的。该模式所执行的所有计算均假设你并不在意日常细节。例如,如果你需要生成两个月份之间进行比较后的计算和报告,该模式非常适用。该模式不支持选择子月份。如果你要比较一个季度中的3天与上一季度中相同的3天,则超出了这个模式的能力:它不起作用。尽管其分析能力存在很大局限性(仅限于月粒度),但与月相关的模式的分析速度仍非常快速且易于执行。此外,对于数据超过12个月的情况,它也可以无缝处理。它具有定制模式的灵活性,并且比标准时间相关模式简单。如果月粒度这个局限不会影响你的计算,那么非常建议你选择使用这个模式。

在与周相关的计算模式中,星期是日历的基础。尽管很多国家采用不同的国家标准来标识年份、季度和星期,但ISO 8601是提供星期日期系统定义的标准之一。一年有52或53个星期,每个季度有13个星期,每个季度又分为5+4+4个星期、4+5+4个星期或4+4+5个星期。如果一年中有53个星期,则其中一个季度有14个星期。因为一个星期不一定完整地包含在一个月份中,所以应将一个季度中的一组星期称为“时间段”,虽然我们通常称之为“月份”。因此,在以下描述中,我们会将月份名称称为“时间段”。

由于星期是主要单位,因此公历日历中的一年与基于周的日历中的一年之间没有对应关系。基于周的日历始终在相同的星期几开始,例如星期一或星期日。因此,偶尔才会在1月1日发生这种情况。对于基于周的年,一年起始于上一年的12月29日,还是当前年份的1月3日,都没有关系。尽管有些不同,但是基于周的日历具有显著的特点:一个季度中的每个“月”都包含相同数量的星期几。将一个季度与另一个季度进行比较,意味着比较相同的天数和相同的星期几。

基于周的日历需要一个专用的Date表。该表包含进行DAX计算的若干列。此外,由于没有现成的可用于对基于周的日历进行计算的DAX函数,所以使用自定义DAX代码来执行此类计算。与周相关的模式的复杂程度要高于与月相关的模式,因为与周相关的模式可让你实现筛选任何时间段,直到“天”的级别。如果你使用基于周的日历,则必须采用基于周的计算模式。

自定义时间相关的计算模式是最灵活(且最复杂)的。作为最后一个模式,它提供与标准时间相关模式相同的计算。它的特点在于整个模式是使用基本的DAX函数编写的,而不使用任何DAX时间智能函数。该模式极为灵活,因为你可以随意变动计算的执行方式。当然,更高的灵活性也会带来更高的复杂性。

那么,你应该选择哪种模式呢?

● 如果常规的公历日历能满足你的需求,那么显而易见,选择标准时间相关的计算模式。

● 如果月粒度足以满足你的报告需求(通常是这种情况,而且比预期的要多得多),那么与月相关的计算模式就是最佳选择,因为它快速而简便。

● 如果你使用基于周的日历,则需要与周相关的计算模式。

● 如果以上情况均不足以满足需求,并且你确实需要完全的灵活性,请准备加入一场漫长而有趣的旅程,深入了解复杂的筛选上下文,然后直接进入自定义时间相关的计算模式。

切记:对于商业智能项目,越简单越好。选择最能直接满足你需求的模式。不用多说,如果你对各种模式之间的差异感到好奇,那么在做出选择之前快速通读所有章节可能会对你很有帮助。