PowerBI中最常用的表是什么?
毫无疑问,日期表!
不同行业的分析,维度表有类别之分,数据表有指标计算之别。但当谈到日期时,基本是一致的。而且日期表也是我们使用时间智能的前提。
由于日期表、时间智能公式非常的好用,往往在做分析时我们都会加入一张日期表。对于我个人,因为经常会收到一些读者发来的数据建模问题,建立日期表对我来说也是一项重复性操作。如何以最快的速度生成一张通用而且好用的日期表呢?很多人都想要找到一个适合自己的最优方案。
常见的方法有四种:
1) 用Excel制作,导入PowerBI (这是最灵活的方法,尤其在使用定制的日历表时)
2) PowerQuery生成,利用编辑查询器中的添加日期列功能(这是以往我比较喜欢的方式,在日历表的使用文章中曾介绍过)
3) 复制前人写过的PowerQueryM代码。这种方法很快很方便,只不过对于很多人这属于黑箱操作,并不理解语句的具体含义。
4) 写DAX公式生成
本文想推荐的就是这第四种写DAX公式的方法,它是所有方法中最快的。
最近在实践中经常使用,屡试不爽。只需要两个步骤,新建表,再复制一段DAX公式。
为什么说这是一个非常好用的方法?我的理由有4点:
1. 上图例子中,Calendar函数生成了一张2016年12月28日到2017年12月31日的日期表。这里的日期可以随意的去替换。
并且,还可以把起始日期替换成Firstdate和Lastdate,比如Firstdate('销售数据表'[订单日期])可以得到销售数据表中的最早订单日期,Lastdate可以得到最近的日期,此方法生成的日期表将永远等于数据表的日期范围,这往往也是我们想要得到的效果。
2. Addcolumns的含义是在生成日期表基础上添加列,这与使用Excel制表的逻辑是一样的。利用基本的日期函数Year、Month、Weeknum和算式求得每一个日期的年季度月日,这些函数与Excel的函数相同,对Excel的使用者来讲不难理解。
Marco说这个公式执行了很多重复的计算,如果利用VAR、Generate、Row函数可以调成最优。
但我认为日期表即使跨度十年也就是3650行,用写两倍长的代码来提升0.0X秒的计算速度,并没有什么吸引力。如果说在速度和简单上来找一个平衡,我更倾向于简单。(当然,这只是针对日期表这个例子。Marco的那篇文章主要是为了说明Generate/Row可以更好地取代Addcolumns,这是另一个有意义的话题。)
3. 注意到在建立[年月]列时,我使用的方法是Year([Date])*100+Month([Date])数字计算,而不是利用Format函数生成“年份月份”的文本格式。这样的好处是在后期使用中不会涉及到日期表的排序问题。(比如经常会遇到“2016年11月”会排在“2016年2月”的前面,而用201611和201602就会很好地避免了这种问题)
4. 这个公式并不难,保存下来可以复制粘贴使用。即使手工输入也不会很费力气。最重要的是你能够理解此公式的含义,根据自己的需要利用Excel类的简单日期函数做调整。
我把公式写在了下面,供直接复制使用。
--------------------------
日期表 = ADDCOLUMNS (
CALENDAR ( date(2016,12,28),date(2017,12,31) ),
"年", YEAR ( [Date] ),
"季度", ROUNDUP( MONTH ( [Date] )/3,0 ),
"月", MONTH ( [Date] ),
"周", WEEKNUM([Date]),
"年季度", YEAR ( [Date] ) & "Q" & ROUNDUP( MONTH ( [Date] )/3,0 ) ,
"年月", YEAR ( [Date] ) * 100 + MONTH ( [Date] ),
"年周", YEAR ( [Date] ) * 100 + WEEKNUM ( [Date] ),
"星期几", WEEKDAY([Date])
)
--------------------------