PowerBI 保持数据刷新后仍显示最后一天

2020-07-02 11:34:46 浏览数 (1)

这个问题我们之前讲过,很多小伙伴问起,我们再来说明下。

问题重述

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 将固定化的工具和设计师的能力有机地结合在一起,好玩。

0 人点赞