Join us at FabCon Atlanta from March 16 - 20, 2026, for the ultimate Fabric, Power BI, AI and SQL community-led event. Save $200 with code FABCOMM.
Register now!Get Fabric certified for FREE! Don't miss your chance! Learn more
场景:
您是否经常看到日期字段旁边有一个日历图标?没错,这就是 Power BI 的日期层次结构。
官方对于日历图标的解释是它是带有内置日期表的日历日期字段:
在创建临时模型或进行数据探索或剖析时,使用这个选项非常方便。但有的时候需要使用日期层次结构来绘制图表时,却发现字段旁边没有日历图标。这太糟糕了,这样我们无法进行下一步的操作。我们需要日期层次结构来帮助我们实现需求。
很明显,模型中的日期字段类型已经是日期类型了。为什么还是没有日期层次结构?如果你也遇到过这样的问题,那么我相信这篇博客能帮助到你。
自动日期和时间
首先,我们需要知道日期层次结构是由于自动日期和时间功能造成的。
自动日期/时间是 Power BI Desktop 中的一个数据加载选项。该选项的目的是根据加载到模型中的日期列支持便捷的时间智能报告。具体来说,它允许报告的作者使用日历时间段(年、季度、月和日)对数据模型进行过滤、分组和深入分析。
如果尚未启用此选项,则需要先启用此选项。
在 Power BI Desktop 中,选择 “文件”>“选项和设置”>“选项”,然后选择 “全局 ”或 “当前文件 ”页面。在这两个页面中,时间智能部分都有该选项。
自动日期/时间可以在全局配置,也可以在当前文件配置。全局选项适用于新的 Power BI Desktop 文件,可以随时打开或关闭。对于新安装的 Power BI Desktop,这两个选项都是默认打开的。 当前文件选项也可以随时打开或关闭。打开时,会创建自动日期/时间表。关闭时,将从模型中移除任何自动日期/时间表。 请注意关闭当前文件选项时要小心,因为这会移除自动日期/时间表格。请务必修复任何已损坏的报告筛选器或已配置使用它们的可视化效果。
实际上,每个自动日期/时间表实际上都是一个计算表,通过使用 DAX CALENDAR 函数生成数据行。这是它的工作原理。每个表还包括六个计算列: 日、月份编号、月份、季度编号、季度和年。 如果可以看到自动日期/时间表的行,如下所示:
启用该选项后,Power BI Desktop 会为每个日期列创建一个隐藏的自动日期/时间表,前提是
有关自动日期/时间选项的更多信息,请查看官方文档: 在 Power BI Desktop 中应用自动日期/时间
仍然没有日期层次结构?
当我们打开该选项并满足前提条件时,仍然看不到日期层次结构。为什么呢? 让我们看看下面的示例。
有两个表,日期和表。日期列是日期类型,键列是整数类型,其他列是文本类型。如下图所示:
日期层次结构就是这种情况,表之间没有关系。
下一步是在两个表的日期列之间建立关系。
我们可以看到,在图 1 和图 2 中,一对多关系的“多”端将丢失日期层次结构,而“一”侧将保留层次结构。 在图 3 和图 4 中,当日期之间的关系是一对一或多对多时,为什么会出现这样的结果呢?
在Power BI 中如何确定在一对多关系中哪一端是真正的“多”端呢?而Power BI 将删除此字段的日期层次结构。
为了得出这个问题的答案,我们可以看看下面的GIF图像。
从上面我们可以看出,在建立字段之间的关系时,Power BI 将第一个选定的字段视为“多”,而 Power BI 将第二个选定的字段视为“一”。 至此,我们终于理解了图 3 和图 4 的工作原理。
我们还注意到其他不直接相关的日期字段将保留日期层次结构。因此,当我们使用日期键字段(整数类型)建立关系时,日期类型列将保留日期层次结构。
当一个日期字段与另一个非日期字段(如整数类型的日期键字段)存在关系时。Power BI 仍会删除一对多关系的“多”端字段的层次结构。
当关系是一对一或多对多时,Power BI 仍将根据上述选择顺序确定哪个字段是真正的“多”。
因此,根据我们上面所看到的,得出结论,影响日期层次结构的另一个重要条件:
当关系是一对多时,Power BI 会根据我们的决定并移除 “多 ”端的日期层次结构。 当关系是一对一或一对多时,Power BI 将根据选择顺序决定哪一端是真正的 “多 ”端。
现在,我们可以看看在日期层次结构方面有哪些需要注意的地方。
满足上述条件后,日期层次结构就可以正常工作了。
标记为日期表
你认为这就是它的全部内容吗?不,实际上还有另一种情况,即使满足上述条件,也仍然无法看到日期层次结构。
图 10是上面提到的正常情况,即日期层次结构保留在“一”端。
但我们注意到,在图 11 中,即使满足上述所有条件,也仍然没有日期层次结构。日期旁边是一个新图标。
这个图标是什么意思呢?
标识字段:具有此图标的字段是“唯一字段”,将被设置为显示全部值,即使它们具有重复项也是如此。 例如,数据中可能存在两个名为 Robin Smith 的不同人员记录,每一条都被视为唯一。 它们不合成一条。 在Power BI Desktop中使用“字段”列表
日期层次结构仍然不可见的原因是该表被标记为日期表。
若要设置日期表,请在“字段”窗格中选择要用作日期表的表,然后右键单击该表并在出现的菜单中选择“标记为日期表”>“标记为日期表”。还可以选择该表,然后从“表工具”功能区中选择“标记为日期表”,如下图所示。
需要注意的是,当指定了自己的日期表时,Power BI Desktop 不会再自动创建它本来会代替我们创建到模型的结构层次。如果后来取消了日期表的选择(并且不再有手动设置的日期表),Power BI Desktop 会重新自动创建日期列的内置日期表。
还需要注意的是,当我们将表标记为日期表时,Power BI Desktop 创建的内置(自动创建的)日期表将被移除,之前基于这些内置表创建的任何可视化或 DAX 表达式将不再正常工作。
有关日期表的更多信息,请参阅文档: 设置自己的日期表
建议
由于每个日期列都会生成自己的(隐藏的)自动日期/时间表,因此无法将时间筛选器应用于一个表并使其传播到多个模型表。在对销售和销售预算等多个主题(事实类型表)进行报告时,以这种方式进行筛选是一种常见的建模要求。使用自动日期/时间时,报表作者需要将筛选器应用于每个不同的日期列。
当数据源已经定义了日期维度表时,则应使用该表在组织内部统一定义时间。如果数据源是数据仓库,则肯定会出现这种情况。否则,可以使用 DAX CALENDAR 或 CALENDARAUTO 函数在模型中生成日期表。
然后,也可以添加计算列以支持已知的时间筛选和分组要求。通过这种设计方法,我们可以创建一个可传播到所有事实类型表的单个日期表,从而可能只需一个表即可应用时间筛选器。有关创建日期表的详细信息,请阅读在 Power BI Desktop 中设置和使用日期表一文。
结论
现在我们终于知道,除了上述条件之外,被标记为日期表的表还会导致字段失去其日期层次结构。
这就是此博客中分享的所有内容,希望对您有用。
作者: Ang Zheng
审稿人: Ula Huang, Kerry Wang
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.