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

如何在SSMS中删除表中连续重复行并计算总成本?

解决方案:删除连续重复记录并计算总成本

要在SSMS中实现删除连续重复记录(ClaimID、ClaimLine、Cost三列完全相同且连续)并计算剩余记录的总成本,可通过LAG窗口函数识别连续重复行,以下是具体实现步骤:

1. 先查询验证结果(不修改原表)

先通过CTE结合LAG函数筛选出需要保留的行,同时计算总成本,避免误删数据:

假设你的表名为Claims,执行以下SQL:

WITH RankedClaims AS (
    SELECT 
        ClaimID,
        ClaimLine,
        Cost,
        -- 获取前一行的对应列值
        LAG(ClaimID) OVER (ORDER BY [你的排序字段]) AS PrevClaimID,
        LAG(ClaimLine) OVER (ORDER BY [你的排序字段]) AS PrevClaimLine,
        LAG(Cost) OVER (ORDER BY [你的排序字段]) AS PrevCost
    FROM Claims
)
SELECT SUM(Cost) AS TotalCost
FROM RankedClaims
WHERE 
    -- 保留第一行(无前置行)
    PrevClaimID IS NULL
    -- 保留与前一行数据不完全相同的行
    OR NOT (ClaimID = PrevClaimID AND ClaimLine = PrevClaimLine AND Cost = PrevCost);

注意:将[你的排序字段]替换为表中能确定行顺序的字段(比如主键ID、创建时间戳),否则连续重复的判断会因为行顺序不确定而出错。

2. 删除连续重复行(修改原表)

确认查询结果正确后,执行以下SQL删除连续重复的行:

WITH DuplicateRows AS (
    SELECT 
        *,
        LAG(ClaimID) OVER (ORDER BY [你的排序字段]) AS PrevClaimID,
        LAG(ClaimLine) OVER (ORDER BY [你的排序字段]) AS PrevClaimLine,
        LAG(Cost) OVER (ORDER BY [你的排序字段]) AS PrevCost
    FROM Claims
)
DELETE FROM DuplicateRows
WHERE 
    PrevClaimID IS NOT NULL
    AND ClaimID = PrevClaimID 
    AND ClaimLine = PrevClaimLine 
    AND Cost = PrevCost;

执行完删除后,再执行普通求和即可得到总成本:

SELECT SUM(Cost) AS TotalCost FROM Claims;

逻辑说明

  • LAG函数用于获取当前行的前一行对应列的值,通过对比当前行与前一行的ClaimID、ClaimLine、Cost,判断是否为连续重复。
  • 保留每一组连续重复行的第一行,删除后续重复行,最终求和结果与示例预期一致(总成本为10)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 23:31:06