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]))