DAX表達式中包含時間智能(Time Intelligence)相關的函數,用於對日期維度進行累加、同比和環比等分析。PowerBI能夠創建關系,通過過濾器來對影響計算的上下文。
DAX表達式有兩種方式計算累加和,TOTALxTD()是DATESxTD()的語法糖,使得PowerBI對累加和的計算更加簡單。
所有的時間關系函數都包含一個特殊的dates參數,該參數有三種形式:
- 對date/time列的引用,格式是DateTable[Date_Column]
- 表格表達式,返回日期/時間類型的單列表
- 布爾表達式,用於定義日期/時間值的單列表。
為了應用時間關系,按照時間對數據分析,最好單獨創建一個日期維度表,並和事實表創建 1 : N 的關聯,確保關系是活躍的。日期維度的粒度設置為Day,確保日期維度表包括所有的日期數據。
一,直接計算累加和
DAX中有三個函數直接用於計算累加和,TOTALMTD是按當前月計算累加和、TOTALQTD是按當前季度計算累加和、TOTALYTD是按當前年份計算累加和:
TOTALMTD(<expression>,<dates>[,<filter>]) TOTALQTD(<expression>,<dates>[,<filter>]) TOTALYTD(<expression>,<dates>[,<filter>][,<year_end_date>])
參數 expression是聚合標量值的表達式,dates是包含日期的字段,filter是過濾器,返回的是布爾值。
例如,計算當前的銷售額:
= TOTALMTD(SUM(InternetSales[SalesAmount]),DateTime[DateKey])
二,返回xTD得所有日期
返回到當前的所有日期,參數dates是只包含一個日期列的表格,函數從dates中取第一個日期作為基准:
DATESMTD(<dates>) DATESQTD(<dates>) DATESYTD(<dates> [,<year_end_date>])
DATESMTD()函數適用於日期維度,該日期維度必須具有連續的非重復日期,從指定數據的第一年的1月1日到去年12月31日,該函數返回一個單列表,該表由上下文中當前日期的月份的第一個月與上下文中的當前日期之間的日期組成。
=CALCULATE(SUM(InternetSales[SalesAmount]), DATESMTD(DateTime[DateKey]))
三,計算同比(前一個年份的同期)
函數PARALLELPERIOD用於計算平行時期,平行日期是指在參數dates上向前或向后移動多個時間間隔(intervals),該函數返回一個包含平行日期的表,使用該函數可以用於計算同比:
PARALLELPERIOD(<dates>,<number_of_intervals>,<interval>)
參數注釋:
- dates 指定當前的日期
- interval 指定時間間隔,有效值是 year、quarter和month
- number_of_intervals 指定向前或向后移動的時間間隔
此函數獲取由dates指定的列中的當前日期集,將第一個日期和最后一個日期移動指定的間隔數,然后返回兩個移位日期之間的所有連續日期。 如果間隔是月,季度或年的部分范圍,則結果中的任何部分月份也將填寫以完成整個間隔。
例如,向前回滾12個月,把DateTime[DateKey]中的最小日期和最大日期移動指定的間隔數,然后返回兩個移位日期之間的所有連續日期,計算這些日期對應的銷量(Sales_Amount)。
CALCULATE([Sales_Amount]*1.1,PARALLELPERIOD(DateTime[DateKey],-12,MONTH))
在該示例中,CALCULATE的第二個參數是一個表格。
另一個函數是SAMEPERIODLASTYEAR(),它是PARALLELPERIOD(DateTime[DateKey],-12,MONTH) 的包裝器:
SAMEPERIODLASTYEAR(<dates>)
四,計算環比(前一天/月/季/年)
函數 PREVIOUS+(DAY/MONTH/QUARTER/YEAR),是把指定的日期向前移動的函數,參數是一個包含日期的數據表,返回的是一個包含日期的數據表。
PREVIOUSDAY(<dates>) PREVIOUSMONTH(<dates>) PREVIOUSQUARTER(<dates>) PREVIOUSYEAR(<dates>[,<year_end_date>])
對於PREVIOUSMONTH()函數,該函數使用dates(輸入參數)中的第一個日期作為基准,返回該日期上個月的所有日期。 例如,如果dates參數中的第一個日期指的是2009年6月10日,則此函數將返回2009年5月的所有日期。
=CALCULATE(SUM(InternetSales[SalesAmount]), PREVIOUSMONTH(Date[DateKey]))
參考文檔: