EARLIER()
是 Power BI(DAX)中一个相对复杂但非常有用 的函数,它主要用于在 嵌套的 CALCULATE
、FILTER
或 ADD COLUMNS
中引用前一行的值。
可以简单理解为:EARLIER()
用来 在行上下文中"向外"取值。
🧠 一、EARLIER 是什么?
EARLIER(column_name)
:返回当前计算行外层上下文 中指定列的值,常用于 嵌套行上下文 中,比如在
CALCULATE
、FILTER
、ADDCOLUMNS
里。
🔍 二、为什么要用 EARLIER?
DAX 的计算有两种上下文:
- 行上下文(当前行)
- 筛选上下文(整体计算条件)
当你在一个嵌套的上下文里,需要引用外层的"当前行"的值时,就要用 EARLIER()
。
📌 三、举个经典例子
你有一张销售表:
客户 | 销售金额 |
---|---|
A | 100 |
A | 200 |
A | 300 |
B | 150 |
B | 250 |
你想要创建一列:
计算"每笔销售相对于该客户总销售金额的占比"。
✅ 正确写法(使用 EARLIER
):
DAX
占比 =
DIVIDE(
Sales[销售金额],
CALCULATE(
SUM(Sales[销售金额]),
FILTER(
Sales,
Sales[客户] = EARLIER(Sales[客户])
)
)
)
🔍 解读:
Sales[客户] = EARLIER(Sales[客户])
表示:在这个FILTER
中,把"当前行客户"值传进去,进行组内筛选。
🔄 四、EARLIER 的"嵌套次数"
EARLIER()
可嵌套使用,默认是 EARLIER(column, 1)
,你也可以写成 EARLIER(column, 2)
来取上上层的上下文值。
但一般用 EARLIER()
(一层)就能搞定大部分情况。
🚫 五、注意事项
EARLIER()
只能在有嵌套行上下文 的表达式中使用(如FILTER
、ADDCOLUMNS
)。- 在
CALCULATE
、SUMX
、FILTER
这些迭代函数中,才有它的用武之地。 - 如果你写的表达式没有嵌套行上下文,会报错:
EARLIER/EARLIEST refers to an earlier row context which doesn't exist.
🆚 六、EARLIER 和变量 VAR
的关系
现代 DAX 更推荐用 VAR
变量来代替 EARLIER()
,可读性更好,比如:
DAX
VAR 当前客户 = Sales[客户]
RETURN
DIVIDE(
Sales[销售金额],
CALCULATE(
SUM(Sales[销售金额]),
Sales[客户] = 当前客户
)
)
更简洁、更好理解!
✅ 总结
项目 | 内容说明 |
---|---|
函数名 | EARLIER() |
作用 | 在嵌套上下文中获取外层行上下文的值 |
使用场景 | 在 FILTER 、ADDCOLUMNS 、CALCULATE 迭代中 |
替代方式 | 用 VAR 定义变量 → 更现代可读 |
注意事项 | 只能在嵌套行上下文中使用,否则会报错 |