0%

Rolling 3MTHs的计算

工作中,经常需要计算Rolling N Months的某个值求和。

比如下图倒数第二列,这里要计算的是每个月的新客户(Create Date为当月的客户),在之后三个月内的销量Tracking。

image-20220516172229729

这种问题非常常见,那么到底用哪个函数会比较容易呢?

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 函数,返回给定区间中的所有日期组成的单列形式的表。包含四个参数:

参数 描述
日期列 包含日期的列
起始日期 日期表达式
偏移量 一个整数,从日期列中添加或减去的偏移单位量;正数向未来推移,反之向过去推移
偏移单位 日期偏移的间隔,可以是以下值之一:yearquartermonth

这个函数不复杂,有意思的是起始日期,可以看到上面我用了FIRSTDATE(Calendar_CRT[Date]) ,也就是FIRSTDATE函数,而实际上我们可以用的函数非常多,MAXMINLASTDATEFIRSTDATE 等等,都可以,最关键的是想办法定义起始日期。

上面这一段,我主要是想说明,因为Rolling N Months的计算,常常我们当前已经筛选出了一个月,例如上图种的Month Name 列,在January这一行,日期并不是某一天,而是一月一整月。而DATESINPERIOD函数的第二个参数必须是具体的某一天,所以要用其他函数来取出这个起始日期。

这一点,对于老手来说其实都不用思考。但是对于新手来说,理清思路的过程中,需要清晰这一点。