函数名 | 目的 | 语法 | 返回值 |
FIRSTDATE | 返回指定日期列在当前上下文中的第一个非空日期。 | FIRSTDATE ( <日期列> ) | 表 包含具有日期值的单列和单行的表。 |
LASTDATE | 返回指定日期列在当前上下文中的最后一个非空日期。 | LASTDATE ( <日期列> ) | 表 包含具有日期值的单列和单行的表。 |
DATESMTD | 返回一个表,其中包含当前筛选上下文中该月份至今的所有日期。 | DATESMTD ( <日期列> ) | 表 包含日期值的单列表 |
DATESQTD | 返回一个表,其中包含当前筛选上下文中该季度至今的所有日期。 | DATESQTD ( <日期列> ) | 表 包含日期值的单列表 |
DATESYTD | 返回一个表,其中包含当前筛选上下文中该年份至今的所有日期。 | DATESYTD ( <日期列> , [年截止日期] ) | 表 包含日期值的单列表 |
一:准备测试数据
我喜欢用数据说话,还是使用之前的测试数据,这套数据横跨 4 年,从 2024 年到 2026 年,每天都不停歇,最早日期是 2024-02-01,最晚日期是 2026-07-11,销售额第一天是 1,第二天是 2,依次到2026-07-11 是 892。
二: 实践出真知
建议先看看前面几篇文章
3. DAX 时间函数-- DATE 日期--一生二,二生三,三生万物_dax date函数-CSDN博客
4. DAX 时间函数-- DATE 日期--START/END OF MONTH/QUARTER/YEAR-CSDN博客
5. DAX 时间函数-- DATE 日期--PREVIOUS/NEXT DAY/MONTH/QUARTER/YEAR-CSDN博客
1) FIRSTDATE 和 LASTDATE 函数
FIRSTDATE | 返回指定日期列在当前上下文中的第一个非空日期。 | FIRSTDATE ( <日期列> ) | 表 包含具有日期值的单列和单行的表。 |
LASTDATE | 返回指定日期列在当前上下文中的最后一个非空日期。 | LASTDATE ( <日期列> ) | 表 包含具有日期值的单列和单行的表。 |
这两个函数很明显,一看就是配套使用。从微软的官方解释来看,也非常简单,我们试试到底是不是这样。
我们准备一下:
FIRSTDATE = FIRSTDATE('日期表'[Date])
LASTDATE = LASTDATE('日期表'[Date])
FIRSTDATE CAL = CALCULATE(SUM('测试数据'[销售额]),FIRSTDATE('日期表'[Date]))
LASTDATE CAL = CALCULATE(SUM('测试数据'[销售额]),LASTDATE('日期表'[Date]))
从上图可以看出,FIRSTDATE 、LASTDATE 只适用于单独找出上下文的日期值,如果和 CALCULATE 系列函数使用,那么它返回的其实是上下文中的所有非空值,而不是字面意思上的第一个、最后一个!
为了验证这一观念,我新写了一个度量指标,然后在过滤器上移动数值范围,可以验证我的观点。
SUM 销售额 = SUM('测试数据'[销售额])
2)DATESMTD、DATESQTD、DATESYTD
DATESMTD | 返回一个表,其中包含当前筛选上下文中该月份至今的所有日期。 | DATESMTD ( <日期列> ) | 表 包含日期值的单列表 |
DATESQTD | 返回一个表,其中包含当前筛选上下文中该季度至今的所有日期。 | DATESQTD ( <日期列> ) | 表 包含日期值的单列表 |
DATESYTD | 返回一个表,其中包含当前筛选上下文中该年份至今的所有日期。 | DATESYTD ( <日期列> , [年截止日期] ) | 表 包含日期值的单列表 |
这三个函数说得很清楚,直接就是返回“表 包含日期值的单列表”。
我先试试创建新表,此刻是 2024-04-18,让我们看看结果。
DATESMTD 表 = DATESMTD('测试数据'[Date])
DATESQTD 表 = DATESQTD('测试数据'[Date])
DATESYTD 表 = DATESYTD('测试数据'[Date])
根据上面三个图,可以看出使用 DATESMTD、DATESQTD、DATESYTD 三个函数创建新表时候,是依次创建出该月份至今、该季度至今、该年至今的日期列表。但是请注意,所谓的该月份,是上下文数据中最靠后的数据,而不是当前数据!正确!
然后我们还可以配套 CALCULATE 使用:
DATESMTD = CALCULATE(SUM('测试数据'[销售额]),DATESMTD('测试数据'[Date]))
DATESQTD = CALCULATE(SUM('测试数据'[销售额]),DATESQTD('测试数据'[Date]))
DATESYTD = CALCULATE(SUM('测试数据'[销售额]),DATESYTD('测试数据'[Date]))
在移动过滤器时候,就会发现移动左值对结果是没有影响的,只有移动右值才有影响。这也进一步证明了前面的结论“使用 DATESMTD、DATESQTD、DATESYTD 三个函数创建新表时候,是依次创建出该月份至今、该季度至今、该年至今的日期列表。但是请注意,所谓的该月份,是上下文数据中最靠后的数据,而不是当前数据!”
~~~~~~~~~~~~博客写得好累,为了攒分,请给个点评,哪怕一个赞字,谢谢同学!~~~~~~~~~