https://zhuanlan.zhihu.com/p/55841964
時間可以說是數據分析中最常用的獨立變量,工作中也常常會遇到對時間數據的對比分析。假設要計算上年同期的銷量,在PowerBI中可以用CALCULATE來寫個度量值[上年同期],
= CALCULATE([數量],
SAMEPERIODLASTYEAR('日期表'[日期]))
這里SAMEPERIODLASTYEAR就是時間智能函數。
時間智能函數和普通函數的區別
時間智能函數與普通的時間或者日期函數的區別是,
- 日期函數直接依賴當前行上下文,一般作為新建列使用,比如YEAR函數,提取日期列的年度;
- 時間智能函數會重置上下文,一般新建度量值時使用,可以快速移動到指定區間
時間智能函數有哪些
在PowerBI中,目前共有33個時間智能函數,列表如下:
看起來好像很多,很難記,其實都是用很直白的英文表達,函數名的意思就是這個函數的功能,有些函數都包括幾個粒度,比如PREVIOUSYEAR/QUARTER/MONTH/DAY,上一年/季/月/天,還有相反方向的下一年/季/月/天,NEXTYEAR/QUARTER/MONTH/DAY,這8個函數可以看作是一類,上表中排序也是把同一類的函數按順序放到了一起,這樣看下來並沒有幾種。
根據這些時間智能函數計算的結果,我把時間智能函數分為以下兩類:
- 返回期間的時間智能函數
返回期間並執行運算的時間智能函數
返回期間的時間智能函數
前24個函數都屬於這種,其中前20個時間智能函數都是非常簡單的,只需要使用一個日期參數就可以,返回對應的時間期間,一般結合CALCULATE使用,比如本文開頭的SAMEPERIODLASTYEAR看起來很長,其實非常簡單,從函數名稱可以看出它是干什么的:上年同期。
第21至24,DATEADD、DATEBETWEEN、DATESINPERIOD 、PARALLELPERIOD ,這4個函數相對復雜一點,但也就是參數多了兩個而已,一般用於相對時間區間的控制,請看下圖中對這4個函數的介紹。
返回期間並執行運算的時間智能函數
從第25個開始,最下面這9個函數更加智能,不僅可以重置上下文,甚至直接對重置后的下上文執行運算,把CALCULATE都省掉了,比如求年初至今的銷量,使用TOTALYTD函數:
=TOTALYTD([數量],日期表[日期])
它和之前使用DATESYTD的效果等同
=CALCULATE([數量],DATESYTD(日期表[日期]))
OPENINGBALANCEYEAR,返回當前行上下文對應的年初余額,如果這個銷售記錄表上還有一列當日結束時的[庫存量],新建度量值
=OPENINGBALANCEYEAR(銷售記錄表[庫存量],
日期表[日期])
將返回2017年的年初庫存,也就是2016年12月31日結束時的庫存量。
CLOSINGBALANCEYEAR/QUARTER/MONTH計算年/季/月末的數據,參數和使用方法類似。
涉及年度的時間智能函數的特殊用法
在33個時間智能函數中,有8個是關於年度的,
DATESYTD
PREVIOUSYEAR
NEXTYEAR
ENDOFYEAR
STARTOFYEAR
TOTALYTD
CLOSINGBALANCEYEAR
OPENINGBALANCEYEAR
這8個函數的參數中最后都有一個可選參數<year_end_date>,意思是年度結束日期,默認情況下就是自然年度的結束日期12月31日,可以省略,在特定的分析中,年度結束日期不是12月31日,那么可以使用這個參數來界定。
在進行財年的分析時,很多國外的公司的財年都不是自然年度,比如蘋果的財年結束日期9月30日,2017財年就是從2016年10月1日到2017年9月30日,計算2018財年的年初至今的銷量:
=CALCULATE([數量],DATESYTD(日期表[日期],"9-30"))
等同於
TOTALYTD=([數量],日期表[日期],"9-30")
都將返回從2017年10月1日到目前的累計銷量。
其他幾個函數不再一一介紹。
時間智能函數與日期表
使用時間智能函數時若出現一些莫名其妙的錯誤,或者返回的數據難以解釋,很大可能是你使用的時間參數有問題。
為了科學的使用時間智能函數,首要的就是建立一個合格的日期表,並將日期列與事實表的日期列建立關聯。
合格的日期表具備以下的特征:
- 起止日期涵蓋事實表的所有日期
- 日期是連續且不重復的
如何生成日期表,有很多方法,可以用Excel、M函數也可以用DAX生成,這里就不細說了,日期表導入到PowerBI Desktop后,首先要把它標記為日期表,
因為日期表的起止日期我們很容易查看是否涵蓋,但是否連續不重復卻並不能輕易看到,標記為日期表的好處是,它會強制檢查日期表的日期列是否為日期格式、是否為連續的、不重復的,如果不是,則無法進行標記,這樣的強制要求保證了后面使用時間智能函數時,不會出現這方面的錯誤。
日期表並不一定要按照網上搜羅的方法生成同樣的粒度列,而是要根據實際分析的需要,建立適合的相關列,比如要按財年來分析,就要按照財年的起止日期來添加財年列;如果要進行最近12個月的滾動分析,就添加一個月份編號。
日期表包含分析需要的維度列,可以簡化DAX的嵌套,建立簡單的度量值就可以輕松聚合所需要的數據。這也是合格的日期表和優秀的日期表的分界線。
時間智能函數並沒有什么神秘,熟悉它使用的參數、搞清它重置的日期區間和返回的數據類型,就掌握了它,在實際分析中多加練習就可以靈活的使用這些函數。選取特定的時間粒度,快速篩選統計區間,輕松搞定時間序列分析。