自动创建日期表是只在 Desktop 里提供的一项功能,使得基于简单模型的日期分析不必再手工创建日期表,其功能的官方描述是“为模型中具有日期或日期/时间数据类型的每个字段自动创建一个隐藏的日期表”。
围绕这个功能先提出 3 个问题,如果你已经知道答案,本篇可以略过。
1. 任意选择日期列拖到值区域,会自动创建日期层次结构,其中包含了模型中本不具备的值,这是如何实现的?(下图 Quarter 和 Month 的值不包含在原始数据中)
2. 如何使用这个隐藏的日期表完成时间智能计算?(即不需要考虑数据源的日期是否连续)
3. 自动创建日期表的原理是什么,它只能辅助简单模型日期计算的原因是什么?
问题 1:为什么
在 Excel 中执行类似的操作,也可以得到包含日期层次结构的值,它们在 PowerPivot 源数据中是隐式创建的,你可以在模型中直观的观察到这种行为。
Excel 创建的日期层次,所有值已经包含在模型里,但在 PBI Desktop 中,似乎观察不到这种行为。那么没有隐式创建行为的发生,这些值是如何出现的呢,答案就在那张自动创建的日期表中,所有通过 Desktop 自动创建的日期层次结构的值,都来源于那张隐藏的日期表。
问题 2:怎么用
某些时间智能函数要求使用连续日期才能计算,在数据源日期不连续的情况下,通常的做法是手工创建一张日期表,与源数据建立关系。如果你精于此道,可能已经熟知通过 M 语言或者 DAX 函数自动创建日期表的 N 种方法。不过自从这个新特性出现后(2016 年 4 月更新),可以直接调用这张隐藏的日期表解决问题。
以下面这 2*2 的原始表为例,两列都是日期格式,Desktop 为每一列自动创建一张日期表,每张表包含了源数据中出现的所有日期所在年份的全部日期。键入完整的时间列后再加一个英文句号,可以调用这张日期表。
源数据 Delivery date 只有两行,而日期表包含了当年的所有日期,结果是 365。
所以,直接在日期列后面加.可以调用连续日期,在使用 dateadd 等时间智能函数的时候会方便很多。
问题 3:原理
目前为止,你已经知道每个日期格式的列都会自动关联一张日期表,而我在文章开始提到这个功能对简单模型的时间计算非常方便,在稍微复杂一些的模型里,我们需要关联多张表的日期,这个功能就帮不上忙了,依然需要手工创建日期表。
如果模型里每张表格都包含多个日期列,然后我们又导入了手工创建的日期表,会不会存在过多的日期表让模型变的臃肿呢?
答案是不会。
奥秘在于,只要将手工创建的日期表与时间列建立关系,那张隐藏的日期表就会自动消失,取消关系,它才会再次出现。
以下面的模型为例(通过特殊的方法将隐藏的日期表显示出来),数据源只包含 sales 和 DateTable 两张表,sales 表有两个日期列(红框)分别与隐藏的日期表建立了关系,DateTable 有一列与隐藏日期表建立关系。最左边被模糊处理的表是一个只有一行的特殊表,与本特性的演示无关。
将 DateTable 与 sales 表日期列建立关系,对应的隐藏日期表会自动消失。下面的动图演示了整个过程。
最后,通过 DAX STUDIO 可以查询到隐藏日期表的内容
以 LocalDateTable 开头的表均为这类日期表,只包含年/季度/月/日 四类信息,对于周或者节假日等特殊的计算需求,需要通过公式辅助实现。或者自己创建的日期表,用起来会更方便。
“(通过特殊的方法将隐藏的日期表显示出来)”, 老师方便透露这个特殊方法吗