基于Power Pivot的保单续保/失效状态识别及净损失比率需求
在Power Pivot中区分已续保与已失效保单的方法
刚好之前处理过类似的多年份保险单数据场景,给你分享几个贴合你需求的实用方法,帮你快速区分已续保和已失效的保单:
核心判断逻辑先理清
根据你描述的情况,保单的状态本质看最后一次投保的状态:
- 如果某保单最新的记录状态是「活跃」,说明一直在续保,属于「已续保」保单
- 如果最新记录状态是「过期」,说明后续没有再续保,属于「已失效」保单
- 之前的多次过期记录都是历史续保痕迹,不用作为最终状态判断依据
方法一:用计算列标记每条记录的归属
步骤1:计算每个保单的最新投保年份
先新建一个计算列,获取每个保单最后一次投保的年份:
最新投保年份 = CALCULATE(MAX('保险单列表'[投保年份]), ALLEXCEPT('保险单列表', '保险单列表'[保单号]))
这个公式的作用是:固定当前行的保单号,计算该保单所有记录里的最大投保年份,也就是最后一次续保的时间。
步骤2:标记保单最终状态
再新建一个计算列,根据最新年份和当前状态判断:
保单最终状态 = IF( '保险单列表'[投保年份] = '保险单列表'[最新投保年份] && '保险单列表'[状态] = "活跃", "已续保", IF( '保险单列表'[投保年份] = '保险单列表'[最新投保年份] && '保险单列表'[状态] = "过期", "已失效", "历史续保记录" ) )
这样每条记录都会被标记:
- 最新年份的活跃记录 → 已续保
- 最新年份的过期记录 → 已失效
- 其余历史记录 → 历史续保记录(方便你过滤或区分)
方法二:直接生成保单状态汇总表(更高效)
如果只需要统计每个保单的最终状态,不用每条记录都标记,可以直接新建一个计算表:
保单状态汇总 = SUMMARIZE( '保险单列表', '保险单列表'[保单号], "最终状态", VAR 最新状态 = CALCULATE(MAX('保险单列表'[状态]), ALLEXCEPT('保险单列表', '保险单列表'[保单号])) RETURN IF(最新状态 = "活跃", "已续保", "已失效") )
这个表会直接输出每个保单号对应的最终状态,省去后续过滤的步骤,非常适合做整体的净损失比率统计。
额外提示
如果你的数据里「活跃」状态只出现在最新的记录里(就像你举的例子那样),其实可以简化逻辑:只要某保单存在「活跃」状态的记录,就判定为已续保;反之所有记录都是过期的,就是已失效。对应的DAX列可以写成:
保单状态 = VAR 存在活跃记录 = CALCULATE(COUNTROWS('保险单列表'), ALLEXCEPT('保险单列表', '保险单列表'[保单号]), '保险单列表'[状态] = "活跃") > 0 RETURN IF(存在活跃记录, "已续保", "已失效")
这个更简洁,适合数据规则比较统一的场景。
内容的提问来源于stack exchange,提问作者Noctis
相关产品推荐
相关产品推荐

