Excel DAX 时间智能
DAX 有一个重要而强大的功能,称为 时间智能 .时间智能使你能够编写引用数据透视表中使用的时间段的 DAX 公式。
DAX 具有 35 个时间智能功能,专门用于随时间聚合和比较数据。但是,这些 DAX 函数对数据有一些限制,你需要了解这些限制并谨慎使用以避免错误。
为什么时间智能让 DAX 变得强大?
时间智能函数处理不断变化的数据,具体取决于你在数据透视表和 Power View 可视化中选择的上下文。如你所知,大多数数据分析涉及对一段时间内的数据进行汇总,比较各个时间段的数据值,了解趋势并根据未来预测做出决策。
例如,你可能希望按产品计算过去一个月的销售额,并将总额与财年中其他月份的销售额进行比较。这意味着,你必须使用日期作为对特定时间段内的销售交易进行分组和汇总的一种方式。
在这里你可以观察到 DAX 的强大功能。你可以使用 DAX 时间智能函数来定义计算字段,以帮助你随时间分析数据,而无需更改数据透视表中的日期选择。这使你的工作更轻松。此外,你可以构建任何其他方式都无法实现的数据透视表。
DAX 时间智能函数的要求
DAX 时间智能功能有一定的要求。如果不满足这些要求,你可能会遇到错误或者它们可能无法正常工作。因此,你也可以将这些要求称为规则或约束。以下是某些 DAX 时间智能功能要求/规则/约束:
-
你需要在数据模型中有一个日期表。
-
日期表必须包含一个被 DAX 视为日期列的列。你可以按你想要的方式命名该列,但它应符合以下条件: o 日期列应包含一组连续的日期,涵盖你正在分析数据的时间段内的每一天。
-
每个日期在日期列中必须存在一次且仅存在一次。
-
你不能跳过任何日期(例如,你不能跳过周末日期)。
-
-
DAX 时间智能功能仅在标准日历上工作,并假设年初为 1 月 1 日,年底为 12 月 31 日,一年中的月份和每个月的天数为日历年。
但是,你可以为不同的财政年度自定义标准日历。在使用任何时间智能功能之前验证上述要求是一个很好的做法。
有关日期表及其在 DAX 公式中的使用的更多详细信息,请参阅本教程库中的教程 = 使用 DAX 进行数据建模。
DAX 时间智能函数 – 类别
DAX时间智能功能可分为以下几类:
- 返回单个日期的 DAX 函数。
- 返回日期表的 DAX 函数。
- 在一段时间内评估表达式的 DAX 函数。
返回单个日期的 DAX 函数
此类别中的 DAX 函数返回单个日期。
该类别有 10 个 DAX 函数:
序号. | DAX 函数和返回值 |
---|---|
1 |
FIRSTDATE(日期列) 返回当前上下文中 Date_Column 中的第一个日期。 |
2 |
LASTDATE(日期列) 返回当前上下文中 Date_Column 中的最后一个日期。 |
3 |
FIRSTNONBLANK(日期列,表达式) 返回表达式具有非空值的第一个日期。 |
4 |
LASTNONBLANK(日期列,表达式) 返回表达式具有非空值的最后日期。 |
5 |
STARTOFMONTH (Date_Column) 返回当前上下文中一个月的第一个日期。 |
6 |
ENDOFMONTH(日期列) 返回当前上下文中一个月的最后一个日期。 |
7 |
STARTOFQUARTER (Date_Column) 返回当前上下文中一个季度的第一个日期。 |
8 |
ENDOFQUARTER(日期列) 返回当前上下文中一个季度的最后一个日期。 |
9 |
STARTOFYEAR (Date_Column, [YE_Date]) 返回当前上下文中一年的第一个日期。 |
10 |
ENDOFYEAR (Date_Column, [YE_Date]) 返回当前上下文中一年的最后一个日期。 |
返回日期表的 DAX 函数
此类别中的 DAX 函数返回日期表。这些函数将主要用作 DAX 函数 - CALCULATE 的 SetFilter 参数。
此类别中有 16 个 DAX 函数。这些 DAX 函数中有八 (8) 个是“上一个”和“下一个”函数。
-
“previous”和“next”函数从当前上下文中的日期列开始,并计算前一天或下一天、一个月、季度或一年。
-
“上一个”函数从当前上下文中的第一个日期开始向后工作,“下一个”函数从当前上下文中的最后一个日期开始向前工作。
-
“上一个”和“下一个”函数以单列表的形式返回结果日期。
序号. | DAX 函数和返回值 |
---|---|
1 |
PREVIOUSDAY (Date_Column) 返回一个表,其中包含所有日期的列,该列表示当前上下文中 Date_Column 中第一个日期之前的日期。 |
2 |
NEXTDAY(日期列) 根据当前上下文中 Date_Column 中指定的第一个日期,返回一个表,其中包含从第二天开始的所有日期的列。 |
3 |
上个月(Date_Column) 根据当前上下文中 Date_Column 中的第一个日期,返回一个包含上个月所有日期列的表。 |
4 |
NEXTMONTH (Date_Column) 根据当前上下文中 Date_Column 中的第一个日期,返回一个包含下个月所有日期列的表。 |
5 |
上一季度(Date_Column) 根据当前上下文中 Date_Column 中的第一个日期,返回一个包含上一季度所有日期列的表。 |
6 |
NEXTQUARTER(日期列) 根据当前上下文中 Date_Column 中指定的第一个日期,返回一个包含下一季度所有日期列的表。 |
7 |
PREVIOUSYEAR (Date_Column, [YE_Date]) 给定当前上下文中 Date_Column 中的最后一个日期,返回一个包含上一年所有日期列的表。 |
8 |
NEXTYEAR (Date_Column, [YE_Date]) 根据当前上下文中 Date_Column 中的第一个日期,返回一个包含下一年度所有日期列的表。 |
四 (4) 个 DAX 函数计算一个时期内的一组日期。这些函数使用当前上下文中的最后一个日期执行计算。
序号. | DAX 函数和返回值 |
---|---|
1 |
DATESMTD (Date_Column) 返回一个表,其中包含当前上下文中当月至今的日期列。 |
2 |
DATESQTD (Date_Column) 返回一个表,其中包含当前上下文中本季度至今的日期列。 |
3 |
DATESYTD (Date_Column, [YE_Date]) 返回一个表,其中包含当前上下文中年初至今的日期列。 |
4 |
SAMEPERIODLASTYEAR (Date_Column) 返回一个表,其中包含在当前上下文中从指定 Date_Column 中的日期向后移动一年的日期列。 注意 : SAMEPERIODLASTYEAR 要求当前上下文包含一组连续的日期。 如果当前上下文不是一组连续的日期,则 SAMEPERIODLASTYEAR 将返回错误。 |
-
四 (4) 个 DAX 函数用于从当前上下文中的日期集转换为新的日期集。
这些 DAX 功能比以前的功能更强大。
-
DAX 函数 – DATEADD、DATESINPERIOD 和 PARALLELPERIOD 从当前上下文移动一些时间间隔。间隔可以是日、月、季度或年,分别由关键词-DAY、MONTH、QUARTER 和YEAR 表示。
例如:
-
-
向后移动 2 天。
-
前进5个月。
-
从今天起向前推进一个月。
-
回到去年的同一季度。
-
DAX 函数 – DATESBETWEEN 计算指定开始日期和结束日期之间的日期集。
如果函数参数 - 间隔数(整数值)为正,则向前移位,如果为负,则向后移位。
-
序号. | DAX 函数和返回值 |
---|---|
1 |
DATEADD(Date_Column、Number_of_Intervals、Interval) 返回一个表,其中包含一列日期,从当前上下文中的日期按指定的时间间隔向前或向后移动。 |
2 |
DATESINPERIOD(Date_Column、Start_Date、Number_of_Intervals、Interval) 返回包含以 start_date 开始并持续指定 number_of_intervals 的日期列的表。 |
3 |
PARALLELPERIOD(Date_Column、Number_of_Intervals、Interval) 返回一个包含日期列的表,该列表示与当前上下文中指定 Date_Column 中的日期平行的时间段,日期在时间上向前或向后移动了多个间隔。 |
4 |
DATESBETWEEN(Date_Column、Start_Date、End_Date) 返回一个包含以 start_date 开始并一直持续到 end_date 的日期列的表。 |
评估一段时间内的表达式的 DAX 函数
此类别中的 DAX 函数在指定时间段内评估表达式。
此类别中有九 (9) 个 DAX 函数:
-
此类别中的三 (3) 个 DAX 函数可用于在指定时间段内评估任何给定表达式。
序号. | DAX 函数和返回值 |
---|---|
1 |
TOTALMTD(表达式、Date_Column、[SetFilter]) 在当前上下文中计算当月至今日期的表达式值。 |
2 |
TOTALQTD(表达式、Date_Column、[SetFilter]) 在当前上下文中,评估本季度至今日期的表达式值。 |
3 |
TOTALYTD(表达式、Date_Column、[SetFilter]、[YE_Date]) 在当前上下文中评估年初至今日期的表达式值 |
-
此类别中的六 (6) 个 DAX 函数可用于计算期初余额和期末余额。
-
任何期间的期初余额与上一期间的期末余额相同。
-
期末余额包括截至期末的所有数据,而期初余额不包括当前期间内的任何数据。
-
这些 DAX 函数始终返回针对特定时间点计算的表达式的值。
-
-
我们关心的时间点始终是日历周期中最后一个可能的日期值。
-
期初余额基于上一期间的最后日期,而期末余额基于当前期间的最后日期。
-
当前期间始终由当前日期上下文中的最后一个日期确定。
序号. | DAX 函数和返回值 |
---|---|
1 |
OPENINGBALANCEMONTH(表达式,Date_Column,[SetFilter]) 在当前上下文中计算当月第一个日期的表达式。 |
2 |
CLOSINGBALANCEMONTH(表达式,Date_Column,[SetFilter]) 在当前上下文中计算该月最后一个日期的表达式。 |
3 |
OPENINGBALANCEQUARTER(表达式,Date_Column,[SetFilter]) 在当前上下文中计算季度第一个日期的表达式。 |
4 |
CLOSINGBALANCEQUARTER(表达式,Date_Column,[SetFilter]) 在当前上下文中计算季度最后一个日期的表达式。 |
5 |
OPENINGBALANCEYEAR(表达式、Date_Column、[SetFilter]、[YE_Date]) 在当前上下文中计算一年中第一个日期的表达式。 |
6 |
CLOSINGBALANCEYEAR(表达式、Date_Column、[SetFilter]、[YE_Date]) 在当前上下文中计算一年中最后一个日期的表达式。 |