人生没有彩排
每一天都是现场直播

55、时间智能函数(三)

本篇文章将介绍时间智能函数中的 PREVIOUS 与 NEXT 这两个系列的函数。

注意,在使用时间智能函数时需要创建日期表,虽然目前的时间智能函数已经优化了很多次,许多限制都已经放开,但创建日期表仍然是一个最佳实践,能够避开许多容易出错的地方。

另外,由于时间智能函数的使用依赖于日期表,而日期表又比较特殊,因此在阅读时间智能函数系列的文章前,最好已经阅读并理解这篇前置文章:32、应用日期表时的注意事项


PREVIOUS系列

PREVIOUS系列的函数可以获取上一个日期范围的日期,包含的函数有:PREVIOUSYEAR、PREVIOUSQUARTER、PREVIOUSMONTH、PREVIOUSDAY。

语法:

PREVIOUSYEAR ( <dates> [,<year_end_date>] )

PREVIOUSQUARTER ( <dates> )

PREVIOUSMONTH ( <dates> )

PREVIOUSDAY ( <dates> )

作用:在指定的日期字段的当前可见数据中,以最小的日期为基准,返回它的上一天/上一个月/上一个季度/上一年的所有日期。

注意事项:

1、日期参数可以接受三种类型的输入,分别为:对日期列的引用、具有单个日期列的表,以及定义单个日期列表的布尔表达式。

2、日期参数如果是对日期列的引用,那么会触发行上下文转换。

3、返回的日期只包括那些存在于第一参数指定的日期列中的日期。

4、PREVIOUSYEAR函数的第二参数是用来指定年的结束日期的,默认为"12-31",常用于财年设置,一般省略该参数保持默认即可。

辅助理解的例子:

1、下面是PREVIOUS系列函数的示例表达式与结果,为方便演示特意使用切片器挑选了部分日期来展示,实际使用的日期表是完整且连续的:

需要注意的是,PREVIOUS系列的函数返回的都是表,因此在度量值里还需要进行聚合成标量值才行,比如上面就是取首尾两个日期拼接成文本来返回。使用到的度量值表达式具体如下:

PREVIOUSYEAR = 
VAR PrePeriod = PREVIOUSYEAR('日期表'[Date])
RETURN
MINX(PrePeriod,'日期表'[Date]) & " - " & MAXX(PrePeriod,'日期表'[Date])

PREVIOUSQUARTER = 
VAR PrePeriod = PREVIOUSQUARTER('日期表'[Date])
RETURN
MINX(PrePeriod,'日期表'[Date]) & " - " & MAXX(PrePeriod,'日期表'[Date])

PREVIOUSMONTH = 
VAR PrePeriod = PREVIOUSMONTH('日期表'[Date])
RETURN
MINX(PrePeriod,'日期表'[Date]) & " - " & MAXX(PrePeriod,'日期表'[Date])

PREVIOUSDAY = PREVIOUSDAY('日期表'[Date])

2、如果用代码来表示的话,它们的等价写法如下:

  • PREVIOUSYEAR函数的等价写法:
PREVIOUSYEAR('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MinDay = MINX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])=YEAR(MinDay)-1
    )
RETURN
Result
  • PREVIOUSQUARTER函数的等价写法:
PREVIOUSQUARTER('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MinDay = MINX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])*4+QUARTER('日期表'[Date])
            =YEAR(MinDay)*4+QUARTER(MinDay)-1
    )
RETURN
Result
  • PREVIOUSMONTH函数的等价写法:
PREVIOUSMONTH('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MinDay = MINX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])*12+MONTH('日期表'[Date])
            =YEAR(MinDay)*12+MONTH(MinDay)-1
    )
RETURN
Result
  • PREVIOUSDAY函数的等价写法:
PREVIOUSDAY('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MinDay = MINX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        '日期表'[Date]=MinDay-1
    )
RETURN
Result

3、这几个函数的日期参数可以接受三种输入,其中一种就是直接引用日期列,而不需要借助任何表函数,因为它等价于:

CALCULATETABLE ( DISTINCT ( '日期表'[Date] ) )

因此,如果第一参数是直接引用日期列,那么还会触发行上下文转换。

4、除了直接引用日期列,日期参数还可以接受具有单个日期列的表,以及定义单个日期列表的布尔表达式,如下图所示:

使用这两种写法时可能会出现红色波浪线的警告,这可能是智能感知功能出了Bug,语法是没问题的,忽略即可。另外,定义单列表的布尔表达式其实也是一个语法糖,它跟CALCULATE函数的布尔筛选是一样的,完整写法如下:

PREVIOUSMONTH('日期表'[Date]=dt"2016-3-8")

等价于:

PREVIOUSMONTH(FILTER(ALL('日期表'[Date]),'日期表'[Date]=dt"2016-3-8"))

需要注意的是,当第一参数不是直接引用日期列时,是不会触发行上下文转换的。


NEXT系列

NEXT系列的函数可以获取下一个日期范围的日期,包含的函数有:NEXTYEAR、NEXTQUARTER、NEXTMONTH、NEXTDAY。

语法:

NEXTYEAR ( <dates> [,<year_end_date>] )

NEXTQUARTER ( <dates> )

NEXTMONTH ( <dates> )

NEXTDAY ( <dates> )

作用:在指定的日期字段的当前可见数据中,以最大的日期为基准,返回它的下一天/下一个月/下一个季度/下一年的所有日期。

注意事项:

1、日期参数可以接受三种类型的输入,分别为:对日期列的引用、具有单个日期列的表,以及定义单个日期列表的布尔表达式。

2、日期参数如果是对日期列的引用,那么会触发行上下文转换。

3、返回的日期只包括那些存在于第一参数指定的日期列中的日期。

4、NEXTYEAR函数的第二参数是用来指定年的结束日期的,默认为"12-31",常用于财年设置,一般省略该参数保持默认即可。

辅助理解的例子:

1、下面是NEXT系列函数的示例表达式与结果,为方便演示特意使用切片器挑选了部分日期来展示,实际使用的日期表是完整且连续的:

需要注意的是,NEXT系列的函数返回的都是表,因此在度量值里还需要进行聚合成标量值才行,比如上面就是取首尾两个日期拼接成文本来返回。使用到的度量值表达式具体如下:

NEXTYEAR = 
VAR NextPeriod = NEXTYEAR('日期表'[Date])
RETURN
MINX(NextPeriod,'日期表'[Date]) & " - " & MAXX(NextPeriod,'日期表'[Date])

NEXTQUARTER = 
VAR NextPeriod = NEXTQUARTER('日期表'[Date])
RETURN
MINX(NextPeriod,'日期表'[Date]) & " - " & MAXX(NextPeriod,'日期表'[Date])

NEXTMONTH = 
VAR NextPeriod = NEXTMONTH('日期表'[Date])
RETURN
MINX(NextPeriod,'日期表'[Date]) & " - " & MAXX(NextPeriod,'日期表'[Date])

NEXTDAY = NEXTDAY('日期表'[Date])

2、如果用代码来表示的话,它们的等价写法如下:

  • NEXTYEAR函数的等价写法:
NEXTYEAR('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])=YEAR(MaxDay)+1
    )
RETURN
Result
  • NEXTQUARTER函数的等价写法:
NEXTQUARTER('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])*4+QUARTER('日期表'[Date])
            =YEAR(MaxDay)*4+QUARTER(MaxDay)+1
    )
RETURN
Result
  • NEXTMONTH函数的等价写法:
NEXTMONTH('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        YEAR('日期表'[Date])*12+MONTH('日期表'[Date])
            =YEAR(MaxDay)*12+MONTH(MaxDay)+1
    )
RETURN
Result
  • NEXTDAY函数的等价写法:
NEXTDAY('日期表'[Date])

等价于:

VAR tTable = CALCULATETABLE(DISTINCT('日期表'[Date]))
VAR MaxDay = MAXX(tTable,'日期表'[Date])
VAR Result = 
    FILTER(
        ALL('日期表'[Date]),
        '日期表'[Date]=MaxDay+1
    )
RETURN
Result

3、这几个函数的日期参数可以接受三种输入,其中一种就是直接引用日期列,而不需要借助任何表函数,因为它等价于:

CALCULATETABLE ( DISTINCT ( '日期表'[Date] ) )

因此,如果第一参数是直接引用日期列,那么还会触发行上下文转换。

4、除了直接引用日期列,日期参数还可以接受具有单个日期列的表,以及定义单个日期列表的布尔表达式,如下图所示:

使用这两种写法时可能会出现红色波浪线的警告,这可能是智能感知功能出了Bug,语法是没问题的,忽略即可。另外,定义单列表的布尔表达式其实也是一个语法糖,它跟CALCULATE函数的布尔筛选是一样的,完整写法如下:

NEXTMONTH('日期表'[Date]=dt"2016-3-8")

等价于:

NEXTMONTH(FILTER(ALL('日期表'[Date]),'日期表'[Date]=dt"2016-3-8"))

需要注意的是,当第一参数不是直接引用日期列时,是不会触发行上下文转换的。


总结

本篇文章主要介绍了时间智能函数中的 PREVIOUS与 NEXT 这两个系列的函数,它们能够很方便的获取到上一个或下一个日期范围,也是很常用到的时间智能函数,建议掌握。

未经允许不得转载:夕枫 » 55、时间智能函数(三)
订阅评论
提醒
guest
1 评论
最新
最久 最赞
内联反馈
查看所有评论