DAX实现获取第N个最近非空销售额及最近3个非空销售日销售额平均值
解决方案:获取最近N个非空销售额的平均值(DAX)
针对你提出的需求——计算任意日期下最近3个非空销售额的平均值,同时要能灵活获取倒数第N个非空销售额,我给你整理了一套DAX实现方案,先结合你的示例数据来看:
示例数据
| Date | Amount | N'th 1 | N'th 2 | N'th 3 | Expected Results |
|---|---|---|---|---|---|
| 2021-02-01 | 1 | 1 | 1.00 | ||
| 2021-02-02 | 2 | 2 | 1 | 1.50 | |
| 2021-02-03 | 2 | 2 | 2 | 1 | 1.67 |
| 2021-02-04 | 2 | 2 | 1 | 1.67 | |
| 2021-02-05 | 3 | 3 | 2 | 2 | 2.33 |
| 2021-02-06 | 3 | 2 | 2 | 2.33 | |
| 2021-02-07 | 3 | 2 | 2 | 2.33 | |
| 2021-02-08 | 4 | 4 | 3 | 2 | 3.00 |
| 2021-02-09 | 4 | 3 | 2 | 3.00 | |
| 2021-02-10 | 4 | 3 | 2 | 3.00 | |
| 2021-02-11 | 4 | 3 | 2 | 3.00 |
DAX实现步骤
1. 定义非空销售额的基础数据集
先创建一个计算表,筛选出所有包含有效销售额的记录,方便后续引用:
NonBlankSales = FILTER( ALL('Sales'), NOT(ISBLANK('Sales'[Amount])) )
2. 创建获取第N个最近非空销售额的度量值
以获取倒数第1、2、3个值为例,分别创建度量值:
倒数第1个非空销售额(N'th 1)
N'th 1 = VAR CurrentDate = MAX('Sales'[Date]) -- 筛选当前日期及之前的最近3个非空销售额,按日期倒序 VAR RankedRecentSales = TOPN( 3, FILTER(NonBlankSales, NonBlankSales[Date] <= CurrentDate), NonBlankSales[Date], DESC ) -- 取倒序后的第1个值 RETURN INDEX(1, RankedRecentSales, OrderBy(NonBlankSales[Date], DESC), KeepAllRows())[Amount]
倒数第2个非空销售额(N'th 2)
只需把INDEX的第一个参数改成2即可:
N'th 2 = VAR CurrentDate = MAX('Sales'[Date]) VAR RankedRecentSales = TOPN( 3, FILTER(NonBlankSales, NonBlankSales[Date] <= CurrentDate), NonBlankSales[Date], DESC ) RETURN INDEX(2, RankedRecentSales, OrderBy(NonBlankSales[Date], DESC), KeepAllRows())[Amount]
倒数第3个非空销售额(N'th 3)
同理,INDEX参数改为3:
N'th 3 = VAR CurrentDate = MAX('Sales'[Date]) VAR RankedRecentSales = TOPN( 3, FILTER(NonBlankSales, NonBlankSales[Date] <= CurrentDate), NonBlankSales[Date], DESC ) RETURN INDEX(3, RankedRecentSales, OrderBy(NonBlankSales[Date], DESC), KeepAllRows())[Amount]
3. 计算预期平均值
最后创建度量值,收集有效非空值并计算平均:
Expected Results = VAR Val1 = [N'th 1] VAR Val2 = [N'th 2] VAR Val3 = [N'th 3] -- 过滤掉空值,只保留有效销售额 VAR ValidSalesValues = FILTER( {Val1, Val2, Val3}, NOT(ISBLANK([Value])) ) -- 计算有效值得平均值 RETURN AVERAGEX(ValidSalesValues, [Value])
方案说明
- 这个方案支持通用化获取第N个最近非空值:只要调整TOPN的数量(比如要取最近5个就改成5)和INDEX的参数,就能灵活获取倒数第N个值。
- 即使当前日期之前的非空销售额不足3个(比如示例中的前两行),
AVERAGEX会自动忽略空值,只计算现有有效值得平均,结果符合预期。
内容的提问来源于stack exchange,提问作者Przemyslaw Remin
相关产品推荐
相关产品推荐

