这个问题我们之前讲过,很多小伙伴问起,我们再来说明下。
问题重述
PowerBI 提供了自动化的报表,每天都会更新。问题是如何保持报告每天都被默认选择为当天?
相对日期
假设今天是2020.06.20,那么,可以使用相对日期筛选器,如下:
该筛选器使用日期表中的日期列作为筛选条件,并设置使用相对日期筛选,如下:
这样就可以确保总是显示相对于今天的上一天。
那么,此时的报告在数据自动更新后,总会显示为相对今天的数据。
注意,这里的相对今天也可能是相对今天的上一天。
日期的相对性
在报表的时间体系中,其实有两套坐标系:
- 现实世界
- 报表世界
现实世界,其中的今天是以现实现实世界的时间来做参考的;报表世界,其中的今天是以报表刷新的最后日期来做参考的。
在 PowerBI 给出的可视化控件中,目前给到用户的是一种静态设置,如下:
定位标记日期指定了要相对的日期,默认是现实世界的今天。这并不能满足我们的需要。
所以,问题一就来了:如何基于某个动态日期点给出筛选,该动态日期点由度量值给出。
日期列表筛选器
日期的相对性问题,只是问题之一,另一个问题是,如果使用日期表作为筛选器,如下:
这种效果有时候是用户一定需要的,选择一个具体的日期点,但问题来了两个:
- 该切片器不会随着数据的更新而自动选择最后更新的日期
- 该切片器如果使用日期表的日期,会显示没有事实数据的日期
问题的分析
至此,积累了三个问题,如下:
- 第一条,如何基于某个动态日期点给出筛选,该动态日期点由度量值给出。
- 第二条,切片器应随着数据的更新而自动选择最后更新的日期。
- 第三条,切片器应只显示有事实数据的日期供用户选择。
这里的入手点是:切片器应随着数据的更新而自动选择最后更新的日期。
通过观察,很快发现 PowerBI 的切片器是不会自动选择某个选项的,至少这绝不会由数据更新而触发,那么,就必须要确保切片器默认选择的选项永远都必须是合理的,例如:假设报告最后刷新日期是 2020.06.27 那么,
这种表现就是默认下可以确保所需效果的。
首先需要一个度量值:
代码语言:javascript复制Start:Date.LastDate.All = MAXX( ALL( 'Order'[OrderDate] ) , [OrderDate] )
然后构造一个计算列:
代码语言:javascript复制日期视图 =
IF( [Date] = [Start:Date.LastDate.All] , "最后一天" , FORMAT( [Date] , "yy/MM/dd" ) )
这样就实现了效果:
我丢,这效果有点不对,除了“最后一天”,其他的日期都显示了出来,这也需要处理。
最终实现
在积累的第二条问题得到解决后,再来看让现在的日期只是相对于我们需要的日期来显示,这就需要:“切片器的切片器”技术。
构建一个度量值如下:
代码语言:javascript复制Topic.Date.IsValid =
IF( VALUES( 'Calendar'[Date] ) <= [Start:Date.LastDate.All] , 1 , 0 )
该度量值用来判断如果是报告最后晒新日期以内的,用 1 表示,否则标记为无效,用 0 表示。
将该度量值用作上述切片器的切片器,如下:
这样就 OK 了。
细节优化
如果觉得这样不够完美,用户不知道最后一天是哪天,可以这样做,再做一个度量值:
代码语言:javascript复制Topic.CurrentDate =
IF(
SELECTEDVALUE( 'Calendar'[日期视图] ) = "最后一天" ,
FORMAT( SELECTEDVALUE( 'Calendar'[Date] ) , "yy/MM/dd" ),
DATEDIFF( SELECTEDVALUE( 'Calendar'[Date] ) , [Start:Date.LastDate.All] , DAY ) & "天前"
)
并用一个文本来做显示,如果用户默认选择了最后一天,则:
否则:
相当完美。
总结
PowerBI 并不是完美的,而且有非常多的问题,而可以弥补这些问题的方法有的人认为是技巧,而有的人认为是设计师的构思和巧妙的灵感。
PowerBI 将固定化的工具和设计师的能力有机地结合在一起,好玩。