语义模型中日期筛选实战:如何灵活包含或排除未来数据 在数据分析报告中,经常会出现规划数据或上一年度数据延伸至未 […]
在数据分析报告中,经常会出现规划数据或上一年度数据延伸至未来日期的情况。然而,展示未来数据有时会造成混淆。如何通过一个切片器,让用户自主选择显示或隐藏未来数据?本文将详细介绍一种实现方法。
假设存在三个度量值:
在包含这些数字的表格中,通常能看到以下情况(假设当前数据仅更新至2025年7月底):

虽然结果正确,但用户可能需要两种不同的视图:
实现方式有多种:
然而,为了设计出用户友好且无需重复工作的报表,更优的方案是添加一个切片器,让用户自行选择是否包含未来数据。
日期表通常包含针对不同时间周期(如日、周、月、季度、年)的索引列。
以下是通过DayIndex列展示的一个小型SQL查询结果示例:

利用此索引列,可以构建一个包含额外列作为切片器的新表。具体步骤是:首先选取所有索引值小于等于0的行,并将其标记为“仅当前数据”。然后,通过UNION操作将日期表中的所有行追加进来,并标记为“包含未来数据”。

上述操作在SQL中完成,但同样可以在Power Query或其他编程语言中实现。完成构建后,将此表导入Power BI。
将新表添加到Power BI后,需要在新表和原有日期表之间建立新的关系:

由于日期筛选表中的DateKey列并非唯一,必须将交叉筛选方向设置为双向:

如果仅保持默认的单向筛选(日期表 -> 日期筛选表),则无法实现通过日期筛选表来筛选日期表的目标。因此,必须将筛选方向设置为“双向”。
接下来,在报表中添加一个切片器:

经过上述配置,切片器便能根据需要选择数据:


用户可以使用此切片器来选择要查看的数据,其选择独立于日历切片器的选择。
上述示例适用于需要在日级别进行筛选的场景,这在将当前数据与预算或去年同期数据进行比较时尤其有用。例如,在月初仅有个别几天销售数据时,与整个月的预算进行比较可能会产生误导。
然而,当筛选需要基于完整周期(如整月或整年)时,应如何处理?以下是一个修改后的查询示例,用于基于整年设置DateFilter列:

现在,即使只应显示当前数据,也会展示整个年份:

可以按照相同的方式修改日期筛选表,以实现按月或其他周期的筛选。这可以通过在日期表中筛选出当前日期所在的行来轻松实现。
这种方法实现简单,对报表使用者来说也易于操作。它避免了编写复杂的DAX代码,完全依赖于日期表中的信息。其核心技巧是通过最小的努力扩展数据模型以满足需求。
如果没有示例中提到的索引列,可以采用其他方法生成日期筛选表。例如,使用T-SQL中的GETDATE()或其他语言中的Now()等函数来获取当前日期。
索引列不仅在此场景中非常有用,在许多其他需要根据相对于当前日期的日期来筛选数据的客户需求中也同样有效。当“当前日期”并非今天,而是需要遵循特定逻辑(例如上一个工作日)时,索引列能让处理变得轻松。
当然,也可以在报表中添加相对日期筛选器,这在许多情况下已经足够。但在其他情况下,索引列提供了更大的灵活性。
与之前的文章一样,本文使用了Contoso示例数据集。可以从Microsoft此处免费下载ContosoRetailDW数据集。Contoso数据可在MIT许可证下自由使用,如此文档所述。本文对数据集进行了修改,将数据偏移到了更近的日期。
免费获取企业 AI 成熟度诊断报告,发现转型机会
关注公众号

扫码关注,获取最新 AI 资讯
3 步完成企业诊断,获取专属转型建议
已有 200+ 企业完成诊断