如何在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
相关产品推荐
相关产品推荐

