加入 PowerBI自己学 知识星球 可以:下载源文件,边学边练;遇到问题,提问交流,有问必答。
日期表基本上每个模型都会用到,为的是可以满足基于日期维度做分析。在日期维度上做分析,本质上是给度量值修改日期上下文,在日期维度上实现日期的平移、范围扩大或缩小,生成一个新的日期或日期区间,然后做运算,比如去年同期、YTD累计、滚动3个月平均、期末库存等。
由于使用频次高,微软专门为此打造了一个系列的日期分析相关函数,称为时间智能函数(Time Intelligence Functions),免去了报告开发者通过CALCULATE+FILTER+ALL(Dim_Date)+指定筛选条件这种较为复杂的方式去修改上下文,直接将时间智能函数用于CALCULATE的第二参数,甚至有些函数直接省略了CALCULATE,大大提升了代码的书写效率和可读性。
时间智能函数清单
类型 | 函数 | 说明 |
---|---|---|
平移取等量 | DATEADD | 将当前上下文中的日期按指定的间隔数向未来推移或者向过去推移。 |
平移取整段 | PARALLELPERIOD | 将当前上下文中的日期按指定的间隔数向未来推移或者向过去推移,取间隔单位的整段日期。 |
指定时间段 | DATESBETWEEN | 指定开始日期到指定结束日期的日期区间。 |
相邻时间段 | DATESINPERIOD | 指定开始日期,相邻的指定的间隔数向未来推移或者向过去推移的日期区间。 |
同期 | SAMEPERIODLASTYEAR | 将当前上下文中的日期等量平移到前一年。 |
指定时间点 | OPENINGBALANCEMONTH | 当前上下文中该月份第一个日期。 |
指定时间点 | OPENINGBALANCEQUARTER | 当前上下文中该季度第一个日期。 |
指定时间点 | OPENINGBALANCEYEAR | 当前上下文中该年份第一个日期,可指定年度结束日期。 |
指定时间点 | CLOSINGBALANCEMONTH | 当前上下文中该月最后一个日期。 |
指定时间点 | CLOSINGBALANCEQUARTER | 当前上下文中该季度最后一个日期。 |
指定时间点 | CLOSINGBALANCEYEAR | 当前上下文中该年份最后一个日期,可指定年度结束日期。 |
指定时间点 | STARTOFMONTH | 当前上下文中指定日期列的月份的第一个日期。 |
指定时间点 | STARTOFQUARTER | 当前上下文中指定日期列的季度的第一个日期。 |
指定时间点 | STARTOFYEAR | 当前上下文中指定日期列的年份的第一个日期,可指定年度结束日期。 |
指定时间点 | ENDOFMONTH | 当前上下文中指定日期列的月份的最后一个日期。 |
指定时间点 | ENDOFQUARTER | 当前上下文中指定日期列的季度的最后一个日期。 |
指定时间点 | ENDOFYEAR | 当前上下文中指定日期列的年度的最后一个日期,可指定年度结束日期。 |
指定时间点 | FIRSTDATE | 当前上下文中指定日期列的第一个日期。 |
指定时间点 | FIRSTNONBLANK | 当前上下文指定列(日期列或其他列均可)中的第一个表达式不为空的值。 |
指定时间点 | LASTDATE | 当前上下文中指定日期列的最后一个日期。 |
指定时间点 | LASTNONBLANK | 当前上下文指定列(日期列或其他列均可)中的最后一个表达式不为空的值。 |
指定时间段 | PREVIOUSDAY | 当前上下文中的日期的第一个日期的前一天的所有日期。 |
指定时间段 | PREVIOUSMONTH | 当前上下文中的日期的第一个日期的上一个月的所有日期。 |
指定时间段 | PREVIOUSQUARTER | 当前上下文中的日期的第一个日期的上一个季度的所有日期。 |
指定时间段 | PREVIOUSYEAR | 当前上下文中的日期的最后一个日期的上一年的所有日期,可指定年度结束日期。 |
指定时间段 | NEXTDAY | 当前上下文中的日期的第一个日期的第二天的所有日期。 |
指定时间段 | NEXTMONTH | 当前上下文中的日期的第一个日期的下一个月的所有日期。 |
指定时间段 | NEXTQUARTER | 当前上下文中的日期的第一个日期的下一个季度的所有日期。 |
指定时间段 | NEXTYEAR | 当前上下文中的日期列的第一个日期的下一年的所有日期,可指定年度结束日期。 |
指定时间段 | DATESMTD | 当前上下文中该月份至今。 |
指定时间段 | DATESQTD | 当前上下文中该季度至今。 |
指定时间段 | DATESYTD | 当前上下文中该年份至今,可指定年度结束日期。 |
指定时间段 | TOTALMTD | DATESMTD变种,省略CALCULATE。 |
指定时间段 | TOTALQTD | DATESQTD变种,省略CALCULATE。 |
指定时间段 | TOTALYTD | DATESYTD变种,省略CALCULATE。 |
举例
函数较多,抛砖引玉,举几个例子了解时间智能函数的用法。
模型
销售表
度量值
销量:
Sales = SUM('Fact_Sales'[SalesVolume])
去年同期:
Sales_LY = CALCULATE([Sales], SAMEPERIODLASTYEAR(Dim_Date[Date]))
去年全年:
Sales_LFY = CALCULATE([Sales], PREVIOUSYEAR(Dim_Date[Date]))
同比增长%:
Sales_Gr%_YoY = DIVIDE([Sales] - [Sales_LY], [Sales_LY])
上季度相同日期:
Sales_LQ = CALCULATE([Sales], DATEADD(Dim_Date[Date], -1, QUARTER))
季度环比增长%:
Sales_Gr%_QoQ = DIVIDE([Sales] - [Sales_LQ], [Sales_LQ])
月均:
MonthlySales = DIVIDE([Sales], DISTINCTCOUNT(Dim_Date[YearMonth]))
上个整季度月均:
MonthlySales_LFQ = CALCULATE([MonthlySales], PREVIOUSQUARTER(Dim_Date[Date]))
对比上个整季度月均增长%:
MonthlySales_Gr%_vsLFQ = DIVIDE([MonthlySales] - [MonthlySales_LFQ], [MonthlySales_LFQ])
坑点
1 使用日期表,日期表要求是整年且连续,日期表的生成可以参考第一章的《复制粘贴PowerQuery代码,生成多功能日期表》。公式调用日期表的日期,不要直接调用事实表中的日期。
2 将日期表标记日期表。日期表和事实表建立关系的列,如果日期列是日期类型,可标记也可不标记;如果日期列是数字类型,比如20240101,必须标记,否则返回的结果可能会出现错误。
因此,建议标记日期表。在数据窗格选中日期表,点击菜单栏表工具下的标记为日期表按钮,在跳出的对话框中选择日期列即可。
3 多数时间智能函数需要用切片器或视觉对象的字段指定时间点或时间段的上下文,否则会返回空白或错误值。
4 有些时间智能函数会推移时间段,导致尚未到来的日期也返回了数字,比如滚动3个月平均,如果不希望未来的月份显示数字,可以通过IF+日期表标记列判断返回空值。
当前月以后的度量值返回空值,利用YearMonth_Offset,度量值写法:
IF(MAX(Dim_Date[YearMonth_Offset])>0, BLANK(), [度量值])
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。