You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一列最大参考号,用CASE语句统计保单金额及数量?

解决alpups表多记录导致保单统计冗余的SQL优化方案

问题背景

需要统计代理的两类数据:Submissions(提交件)和Policies(保单),仅对Policies统计GWP金额。现有SQL可运行,但因alpups表中单个保单存在多条记录,导致Policies数量和GWP金额统计了冗余数据,需仅保留每个保单最大REFERNCE#对应的记录来统计。

现有SQL及问题

现有SQL:

select a.agsub# as Code, 
sum(case when a.pmstat in ('R', 'Q') then 1 else 0 end) as Submissions,
sum(case when a.pmstat not in ('R', 'Q') then 1 else 0 end) as Policies,
sum(case when a.pmstat not in ('R', 'Q') then (b.pstmap) else 0 end) as GWP 
from cipomf a
inner join alpups b 
on comp# = psconr
and pmprfx = psprfx
and pmplnr = psplnr
inner join ciprar c
on pmprar = paprar
inner join agagtn d
on a.agsub# = d.agsub#
where (PMPRAR = '057' and a.agsub# = '170129')
and (a.pmstat in ('R', 'Q') or a.pmstat != 'Q')
group by a.agsub#, pmprar
order by pmprar

当前结果:

CODE     SUBMISSIONS    POLICIES    GWP
170129          7           3       43746.00

期望结果:Submissions计数正确(7),Policies应为2,GWP应为24074.00。问题源于alpups表的重复保单记录:

AGSUB#  AMOUNT          REFERNCE#
170129  4232.00     7372236   --保单1的唯一记录
170129  19672.00    7372239   --保单2的初始记录
170129  19842.00    7473004   --保单2的最新记录

需要仅选取保单2的最大REFERNCE#(7473004)对应的记录,忽略较低的7372239。

解决方案

方案1:使用CTE+窗口函数筛选最新记录

通过窗口函数给每个保单的记录按REFERNCE#降序编号,只保留编号为1的最新记录:

WITH latest_alpups AS (
    SELECT 
        psconr, psprfx, psplnr, pstmap,
        ROW_NUMBER() OVER (PARTITION BY psconr, psprfx, psplnr ORDER BY REFERNCE# DESC) AS rn
    FROM alpups
)
select a.agsub# as Code, 
sum(case when a.pmstat in ('R', 'Q') then 1 else 0 end) as Submissions,
sum(case when a.pmstat not in ('R', 'Q') then 1 else 0 end) as Policies,
sum(case when a.pmstat not in ('R', 'Q') then (b.pstmap) else 0 end) as GWP 
from cipomf a
inner join latest_alpups b 
on a.comp# = b.psconr
and a.pmprfx = b.psprfx
and a.pmplnr = b.psplnr
and b.rn = 1  -- 仅保留每个保单的最新记录
inner join ciprar c
on a.pmprar = c.paprar
inner join agagtn d
on a.agsub# = d.agsub#
where (a.PMPRAR = '057' and a.agsub# = '170129')
and (a.pmstat in ('R', 'Q') or a.pmstat != 'Q')
group by a.agsub#, a.pmprar
order by a.pmprar

方案2:子查询筛选最大REFERNCE#记录

如果数据库不支持窗口函数,可通过子查询直接匹配每个保单的最大REFERNCE#:

select a.agsub# as Code, 
sum(case when a.pmstat in ('R', 'Q') then 1 else 0 end) as Submissions,
sum(case when a.pmstat not in ('R', 'Q') then 1 else 0 end) as Policies,
sum(case when a.pmstat not in ('R', 'Q') then (b.pstmap) else 0 end) as GWP 
from cipomf a
inner join alpups b 
on a.comp# = b.psconr
and a.pmprfx = b.psprfx
and a.pmplnr = b.psplnr
-- 确保当前记录是该保单的最大REFERNCE#
and b.REFERNCE# = (
    SELECT MAX(REFERNCE#) 
    FROM alpups 
    WHERE psconr = a.comp# 
      AND psprfx = a.pmprfx 
      AND psplnr = a.pmplnr
)
inner join ciprar c
on a.pmprar = c.paprar
inner join agagtn d
on a.agsub# = d.agsub#
where (a.PMPRAR = '057' and a.agsub# = '170129')
and (a.pmstat in ('R', 'Q') or a.pmstat != 'Q')
group by a.agsub#, a.pmprar
order by a.pmprar

说明

两种方案均通过提前筛选alpups表中每个保单的最新记录,避免了重复统计。Submissions的统计逻辑保持不变,因为它不受alpups表的重复记录影响。

内容的提问来源于stack exchange,提问作者katmaster89

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 04:37:04