1. 概述
1.1 应用场景
对于销售额、订单数量等指标,通常可以直接按照不同维度进行求和。
但账户余额、库存余量等数据有所不同。例如,同一个账户一天内产生了多次余额记录,如果要计算当前账户余额,需要取得该账户最新时间对应的余额,而不能将不同时间的余额全部相加。
| 场景 | 计算方式 |
|---|---|
| 账户余额 | 每个账户取最新时间对应的余额,再按地区、网点等维度汇总 |
| 库存余量 | 每个库房、商品取最新时间对应的库存,再按地区等维度汇总 |
1.2 功能简介
半累加是创建指标时的一项可选配置,用于处理部分维度不能直接累加,而其他维度仍需要正常汇总的场景。
例如,计算账户余额时:
沿「时间」维度不能直接累加,需要取每个账户最新时间对应的余额;
沿「地区」维度仍可以正常汇总,将该地区下各账户的余额相加。
开启「半累加指标」后,可以通过「不可累加维度」「窗口分组」和「取值」控制具体的计算规则,无需手动编写复杂公式。
2. 设置半累加指标
2.1 配置说明
进入语义模型编辑页面,创建或编辑指标。

完成指标名称、计算方式等基础设置后,开启「半累加指标」,并设置以下内容:

| 配置项 | 说明 |
|---|---|
| 不可累加维度 | 指标不能直接进行累加的维度,系统将根据该维度寻找指定记录。 最多只可选择 1 个。 |
| 窗口分组 | 确定分别在哪些分组中寻找不可累加维度的指定值 不设置时,将基于全部数据寻找不可累加维度的最大值或最小值 |
| 取值 | 设置取得不可累加维度的最大值或最小值 |
例如:
| 示例 | 场景 | 可视化配置 |
|---|---|---|
求最晚时间的账户余额
| 按账户取「最后一次流水时间」的余额,再按「网点/支行」汇总 |
|
求最晚时间的库存余量
| 按库房、品类取「最后一次记录时间」的库存,再按地区汇总 |
|
求考生科目的最高成绩![]() | 考生同一科目多次考试,取「最高/最低分」作为最终成绩 |
|
2.2 示例:创建账户余额指标
例如,存在以下账户流水数据:
| 地区 | 账户 | 时间 | 流水余额 |
|---|---|---|---|
| A | ZH100 | 2025-10-11 18:00 | 100 |
| A | ZH100 | 2025-10-11 19:00 | 200 |
| A | ZH101 | 2025-10-11 18:00 | 300 |
现在需要计算每个账户的最新余额,并进一步查看各地区的账户余额合计。
如果直接对「流水余额」求和,地区 A 的结果为:100 + 200 + 300 = 600
但 ZH100 在 18:00 的余额 100 已经被 19:00 的余额 200 更新,因此不能将两条记录同时累加。
正确的计算结果应该为:ZH100 最新余额 200 + ZH101 最新余额 300 = 500
2.2.1 创建指标
在语义模型中创建「账户余额」指标。计算方式选择「字段」,选择「流水余额」并设置对应的汇总方式。
然后开启「半累加指标」,设置:
| 配置项 | 设置 |
|---|---|
| 不可累加维度 | 时间 |
| 窗口分组 | 账户 |
| 取值 | 最大值 |

此时,系统会分别在每个账户中找到最大的「时间」,并取得该时间对应的流水余额。
对于示例数据:
ZH100 的最大时间为 2025-10-11 19:00,对应余额为 200;
ZH101 的最大时间为 2025-10-11 18:00,对应余额为 300。
设置完成后保存指标。
后续可以将该指标加入模型指标集并发布,在分析主题中按照地区、账户等可用维度进行分析。
2.2.2 效果预览
完成指标配置后,查询数据结果。地区 A 所有账户余额为「500」。

账户「ZH100」余额为「200」。

添加所有字段预览数据明细,效果如下图所示:

3. 计算逻辑
半累加指标可以理解为:先确定应该保留哪一条记录,再进行正常汇总。
整体计算顺序为:先应用指标过滤条件 → 按窗口分组查找不可累加维度的最大值或最小值 → 取得对应的指标结果 → 按其他分析维度正常汇总。
以「账户余额」为例,配置:不可累加维度 = 时间;窗口分组 = 账户;取值 = 最大值
系统会先按照「账户」分别计算,找到每个账户最大的时间,并取得该时间对应的余额。
之后,如果按照「地区」分析,则再将该地区下各账户已经计算出的余额进行汇总。
因此,半累加并不是让指标完全不能累加,而是只对指定维度采用特殊取值规则,其他维度仍按照指标原有的汇总方式计算。
| 点击展开更多 |
| 半累加函数计算逻辑转化为公式如下: 汇总方式(def_add(汇总方式(指标) , [窗口分组] ,[不可累加维度=def(最大/最小值聚合函数(不可累加维度),add_dim())])) 公式说明:
|
4. 使用说明
4.1 不可累加维度最多选择一个
一个半累加指标只能设置一个「不可累加维度」。
例如,账户余额场景中按照「时间」寻找最大值。如果同时设置多个不可累加维度,将无法明确应该按照哪个维度寻找最大值或最小值。
4.2 窗口分组可以不设置
「窗口分组」用于确定分别在哪些对象中寻找不可累加维度的最大值或最小值。
例如:窗口分组 = 账户
表示分别寻找每个账户的最大时间。
如果不设置窗口分组,则基于全部数据寻找不可累加维度的最大值或最小值,再取得对应的数据进行计算。
因此,大多数需要计算「每个账户最新余额」「每个商品最新库存」的场景,都需要根据实际业务对象设置窗口分组。
4.3 最大值或最小值对应多条记录
如果同一个窗口分组中,不可累加维度的最大值或最小值对应多条数据,系统会继续按照当前指标设置的汇总方式处理这些记录。
例如,同一账户在相同的最大时间存在多条余额记录,指标汇总方式为「求和」时,将对这些记录继续求和。
如果业务上不应出现多条记录,建议检查原始数据是否存在重复数据。
4.4 与过滤条件组合使用
半累加指标可以同时设置指标过滤条件。
计算时,会先应用过滤条件,再执行半累加计算。
例如,只计算「正常营业门店」的最新库存时,会先筛选出正常营业门店的数据,再分别取得各商品最新日期对应的库存。
4.5 与时间衍生组合使用
半累加指标可以继续设置时间衍生,用于进行同期、同比、环比等时间分析。
此时,系统会先按照半累加规则计算对应时间范围内的指标结果,再基于结果进行时间衍生。
例如,「账户余额同比」可以分别计算当前周期和去年同期各账户对应时间的余额,再比较两个周期的结果。
4.6 使用限制
创建半累加指标时,当前存在以下限制:
指标的「汇总方式」不能为「明细值」;
指标计算使用的字段及过滤条件需要基于同一个基准表,不支持跨多个基准表进行半累加计算(不能跨多个表)。
