大数跨境

scan的累加器和reduce累加器有什么区别,输出结果为什么不同。scan和reduce组合vstack最终输出结果一样吗,举例说明

scan的累加器和reduce累加器有什么区别,输出结果为什么不同。scan和reduce组合vstack最终输出结果一样吗,举例说明 浅谈出口账务和excel函数
2026-10-06
9
SCAN 与 REDUCE:累加器机制相同,输出策略不同

一、核心区别一句话

· SCAN:每一步都输出累加器的当前值 → 输出与输入数组同形状的过程数组。
· REDUCE:只输出最后一步的累加器值 → 输出单个结果(标量或数组)。

两者的累加器 x 更新逻辑完全一样,都是:

```excel
x = LAMBDA(x, y, ...)   ' 每一步用当前值 y 更新状态 x
```

区别只在于:SCAN 把每一步的 x 都记下来,REDUCE 只留最后的 x。

---

二、累加器本身没有区别

对比项 SCAN REDUCE
累加器变量 x x
当前值 y y
更新规则 LAMBDA(x,y,新x) LAMBDA(x,y,新x)
初始值 第一个参数 第一个参数
迭代方式 逐个元素,记录每一步 逐个元素,只保留最终
输出 与数组同形状 单个值

所以:

· 累加器机制相同:都是状态机,x 是抽象状态。
· 输出不同:SCAN 输出所有中间状态,REDUCE 只输出最终状态。

---

三、数字累加例子

数据 A2:A6 = 1, 2, 3, 4, 5

1. SCAN

```excel
=SCAN(0, A2:A6, LAMBDA(x, y, x + y))
```

输出 5 行:

```text
1
3
6
10
15
```

每一步的 x 都被输出:

步 y x 更新后 输出
1 1 1 1
2 2 3 3
3 3 6 6
4 4 10 10
5 5 15 15

2. REDUCE

```excel
=REDUCE(0, A2:A6, LAMBDA(x, y, x + y))
```

输出单个值:

```text
15
```

只保留最后一步的 x。

3. REDUCE + VSTACK 模拟 SCAN

```excel
=DROP(
  REDUCE({0}, A2:A6, LAMBDA(x, y,
    VSTACK(x, INDEX(x, ROWS(x)) + y)
  )),
  1
)
```

输出:

```text
1
3
6
10
15
```

与 SCAN 完全相同。

原理:在 REDUCE 内部,把每一步的新状态 VSTACK 到累加器数组 x 中。这样 x 既是状态,又是结果数组。最后用 DROP 去掉初始值 0。

---

四、文本填充例子(科目填充)

数据:

行 A列
2 应收账款
3 15200
4 3600
5 应付账款
6 5000
7 3000
8 2000
9 预付账款
10 8000

1. SCAN

```excel
=SCAN(A2, A2:A10, LAMBDA(x, y,
  IF(ISNUMBER(y), x, y)
))
```

输出 9 行:

```text
应收账款
应收账款
应收账款
应付账款
应付账款
应付账款
应付账款
预付账款
预付账款
```

2. REDUCE

```excel
=REDUCE(A2, A2:A10, LAMBDA(x, y,
  IF(ISNUMBER(y), x, y)
))
```

输出单个值:

```text
预付账款
```

只保留最后所处的科目。

3. REDUCE + VSTACK 模拟 SCAN

```excel
=REDUCE(A2, A3:A10, LAMBDA(x, y,
  VSTACK(x, IF(ISNUMBER(y), INDEX(x, ROWS(x)), y))
))
```

输出:

```text
应收账款
应收账款
应收账款
应付账款
应付账款
应付账款
应付账款
预付账款
预付账款
```

与 SCAN 相同。

注意:

· 初始值 A2 已经代表第一行结果,所以迭代范围从 A3:A10 开始,避免重复。
· INDEX(x, ROWS(x)) 取累加器数组的最后一行,即当前状态。
· 如果 y 是数字,就沿用当前状态;如果 y 是文本,就切换到新科目。

---

五、SCAN 与 REDUCE + VSTACK 最终结果一样吗?

可以一样,但有条件:

条件 说明
正确设置初始值 避免多一行或少一行
正确选择迭代范围 通常从第二个元素开始迭代
正确堆叠方向 VSTACK 垂直堆叠;若输入是行数组,需用 HSTACK 或 TRANSPOSE
手动维护状态 用 INDEX(x, ROWS(x)) 取当前状态
性能代价 REDUCE + VSTACK 每一步都重建数组,复杂度 O(n²),大数据慢;SCAN 原生优化

所以:

· 逻辑上可以等价:REDUCE + VSTACK 能模拟 SCAN。
· 实际使用中不等价:SCAN 更简洁、更高效、更不易错。
· 输出形状可能不同:SCAN 输出形状与输入数组一致;VSTACK 总是垂直堆叠,可能改变形状。

---

六、总结

维度 SCAN REDUCE
累加器机制 状态变量 x 状态变量 x
输出内容 每一步的 x 最后的 x
输出形状 与输入数组同形状 单个值
典型用途 填充、累计、状态跟踪 汇总、归约、求最终值
模拟关系 — REDUCE + VSTACK 可模拟 SCAN,但麻烦且慢

一句话:

SCAN 是“扫描并记录轨迹”,REDUCE 是“归约并只留终点”。
累加器本身一样,输出策略不同,所以结果不同。
REDUCE 配合 VSTACK 可以强行记录轨迹,最终输出与 SCAN 相同,但 SCAN 是原生、简洁、高效的做法。

【声明】内容源于网络
0
0
浅谈出口账务和excel函数
1234
内容 1597
粉丝 0
浅谈出口账务和excel函数 1234
总阅读30.4k
粉丝0
内容1.6k