工作中,经常需要计算Rolling N Months的某个值求和。
比如下图倒数第二列,这里要计算的是每个月的新客户(Create Date为当月的客户),在之后三个月内的销量Tracking。

这种问题非常常见,那么到底用哪个函数会比较容易呢?
Rolling 3 MTHs =
VAR D = FIRSTDATE( Calendar_CRT[Date] )
RETURN
CALCULATE(
SUM( 'ECDatas Finance PL Fin'[Volume] ),
DATESINPERIOD( Calendar[Date], D, 3, MONTH )
)
我个人习惯于用 DATASIPERIOD 函数。
简单说,DATASIPERIOD 函数,返回给定区间中的所有日期组成的单列形式的表。包含四个参数:
| 参数 | 描述 |
|---|---|
| 日期列 | 包含日期的列 |
| 起始日期 | 日期表达式 |
| 偏移量 | 一个整数,从日期列中添加或减去的偏移单位量;正数向未来推移,反之向过去推移 |
| 偏移单位 | 日期偏移的间隔,可以是以下值之一:year、quarter、month |
这个函数不复杂,有意思的是起始日期,可以看到上面我用了FIRSTDATE(Calendar_CRT[Date]) ,也就是FIRSTDATE函数,而实际上我们可以用的函数非常多,MAX、MIN、LASTDATE、FIRSTDATE 等等,都可以,最关键的是想办法定义起始日期。
上面这一段,我主要是想说明,因为Rolling N Months的计算,常常我们当前已经筛选出了一个月,例如上图种的Month Name 列,在January这一行,日期并不是某一天,而是一月一整月。而DATESINPERIOD函数的第二个参数必须是具体的某一天,所以要用其他函数来取出这个起始日期。
这一点,对于老手来说其实都不用思考。但是对于新手来说,理清思路的过程中,需要清晰这一点。