### 🤬 场景需求
在制造业财务建模中,计算**“累计数”**(如累计折旧、实时库存余量、累计回款)是高频动作。
当你使用经典的 `CALCULATE(SUM(…), FILTER(ALL(Calendar), [Date] <= MAX([Date])))` 时,一旦事实表突破 100 万行,报表切片器卡顿感明显,甚至导致“视觉对象内存超限”。
### 💡 知识点破局
**放弃 FILTER 嵌套,拥抱索引加速。**
在 DAX 引擎中,复杂的 FILTER 迭代是性能杀手。通过在 Power Query 中预生成一个**“累计辅助索引”**(影子表逻辑),或使用 DAX 窗口函数 `WINDOW` 能够大幅降低引擎扫描成本。
**推荐方案:WINDOW 函数直接取数**
```dax
累计库存 (高效版) =
SUMX(
WINDOW(
1, ABS,
0, REL,
ORDERBY('日期表'[Date], ASC)
),
[当日库存变动]
)
```
> **核心优势:** `WINDOW` 函数直接在公式引擎层面对数据块进行切片,无需像 `FILTER` 那样逐行扫描每一行日期,性能提升通常在 50%-80% 以上。
### ⚠️ 避坑提醒
1. **排序一致性:** `WINDOW` 函数中的 `ORDERBY` 必须与日期表字段完全一致,否则累计逻辑会错乱。
2. **粒度陷阱:** 如果你的累计涉及多个维度(如按 SKU + 仓库累计),务必在 `WINDOW` 的 `PARTITIONBY` 中声明分区维度,否则会造成内存溢出。
3. **计算列 vs 度量值:** 百万级数据建议直接在后端 SQL 或 Power Query 中预先处理静态累计,前端仅保留动态切片的度量值。














暂无评论内容