在 Power BI 中常常遇到与周计算有关的问题。我们将按照不同场景分拆来进行介绍,给出最佳实践。
年季月周日
在业务中,由于管理和运营的周期不同,大部分情况会涉及到:年,季,月,周,日。
其中,周 是一个比较特殊的周期。
年是最大的范围,没有问题。
季度一年固定出现 4 个,也没有问题。
月度一年固定出现 12 个,也没有问题。
日期则按照自然顺序排列,也没有问题。
周,不管在月,季,年的范围来看,都是一种不固定的周期,例如:
1、不同的月,周的规律不同
2、不同的年,周的规律也不同
然后,很多业务都是以周作为周期来进行的,因为人们日常周一到周五上班,周六和周日休息。周其实是人们生活的规律。
所以,必须要来处理周的问题。
Power BI DAX 对周的支持
Power BI DAX 对周的内置支持是:无。
DAX 的时间智能函数固然强大而且方便,但却没有提供对于周粒度的内置支持,可见:周问题并无统一规律。
对与周相关计算有过探索的伙伴很快就可以发现:
用 -7 DAY 这个方法,并不能处理周的问题。因为,在很多场景,我们要的是一个整个周。例如:我们想知道上周整体的量,和上上周整体的量的对比。
移动日期和获取整个区间,是完全不同的。
年周序号
为了获得一个整周,大家会在日期表里增加一个周序号字段,用 DAX 实现,如下:
代码语言:javascript复制ADDCOLUMNS(
date_table_base ,
"WeekNumerInYear" , WEEKNUM( [Date] , 2 )
)
则有:
代码语言:javascript复制本周序号 = MAX( Calendar[WeekNumerInYear] )
上周序号 = 本周序号 - 1
那么,这样就可以计算本周的量和上周的量,进而计算环比了。
然而,很快就会意识到一个错误:在跨年的时候是不能正确计算的。恍然了解,没有错。但思路立马就有了:
- 如果是第 1 周,则上周用去年的最后 1 周。
- 否则正常按上述方式计算。
很可惜,很快又会发现问题:
- 去年最后 1 周,并不是 1 个完全周
彻底崩溃,即使处理这个问题,也会导致逻辑很复杂。
没有错。这是一个分水岭。
有人想:这么复杂,只是想算一个周环比而已。算了,找 IT 吧。
不难发现:复杂的不是工具,而是业务本身,要做这样的业务计算,就存在这样的业务逻辑。
全局周与全局月
回顾这个问题的难点,我们是因为惯性思维:
- 年内的计算是正确的
- 发现跨年是错误的
- 由于思维惯性想到:
- 如果年内则按规则算
- 如果跨年则单独解决这个特殊点
这是很常规的思维特点,也是很好的,一般思路和特殊点的处理,但创新的思维也常常是受限于无法克服思维惯性。
这里给出全局周的概念,从历史开始,逐个累计,那么就不存在跨年的问题了。用 DAX 实现如下:
代码语言:javascript复制 ADDCOLUMNS(
date_table_base ,
"WeekNumerInYear" , WEEKNUM( [Date] , 2 ) ,
"WeekNumberGlobal" ,
DATEDIFF(
MINX( FILTER( date_table_base , [DayNumberInWeek] = 1 ) , [Date] ) ,
[Date] - 1 ,
WEEK
)
)
习惯用模板的伙伴就不要问为什么了,直接用吧;有好奇非要看懂逻辑的,那自己看吧。
结果是:
相信你已经可以猜出全局周的威力了。那么计算周环比就很简单了,不再展开。留给读者自己实现。
总结
本文表面给出了周环比的计算技巧,实际上提出了全局周期的通用计算定式。同时,指出了创新的思维来自克服思维惯性,并示范了思维惯性的表现。
关于时间维度计算,我们将在 2021-04-15 微软社区上演精彩的演说,请记住:复杂的不是工具,复杂的是业务本身;要配得上简单,就得穿越复杂。但不要紧,我们将和大家一起穿越这些复杂,为大家带来各种定式,模式,套路。不论是想偷用模板,还是想好奇研究,都是上佳的,不容错过。
只对当时参与的伙伴提供案例资源,后续索要,不再回复,请理解你没时间就没机会的复杂逻辑来自业务本身如此。
立刻报名:(报名截至 2021-04-14 23点)
PowerBI 技术讲座系列 - BI佐罗专场 - 时间智能分析
你可能还想知道:
超级福利中国版PowerBI高级个人版现已开通,从零免费无限试用法泄露
PowerBI 实现客户同期群分析及可视化
全网首发 Power BI 零售通用系统化解决方案大型模板
BI真经 - 让数据真正成为你的力量
DAX 设计模式(第二版)中文在线学习正式开放