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