SQL Server 从表中删除连续的重复行

kd3sttzy  于 2022-12-28  发布在  其他
关注(0)|答案(1)|浏览(148)

我被一个问题卡住了。我想删除表中连续的重复记录,
I,e,在下表中我想计算没有连续重复的总成本。
类似地,行3应该被移除,因为它与行2连续重复,因为所有3列数据是相同的。
第二组的情况也是如此,第7行应该删除,因为它是第6行的重复。
最后的总成本应该是10。
如何在SSMS中执行此操作?
| 索赔编号|索赔行|费用|
| - ------|- ------|- ------|
| 分子量为1616878951|第二章|十个|
| 分子量为1616878951|第二章|-10|
| 分子量为1616878951|第二章|-10|
| 分子量为1616878951|三个|十个|
| 分子量为1616878951|三个|-10|
| 分子量为1616878951|三个|十个|
| 分子量为1616878951|三个|十个|
我搜索这个问题,并尝试领先和滞后关键字,但没有工作。

wnavrhmk

wnavrhmk1#

我为你的问题准备了一个例子,它可能是解决方案。
我使用CTEROW_NUMBERIIF表达式生成row_number并过滤重复行。
准备示例数据:

DECLARE @vClaims TABLE (
    ClaimID     NVARCHAR(16),
    ClaimLine   SMALLINT,
    Cost        SMALLINT
)

INSERT INTO @vClaims
VALUES
    ('M0001R1616878951', 2, 10),
    ('M0001R1616878951', 2, -10),
    ('M0001R1616878951', 2, -10),
    ('M0001R1616878951', 3, 10),
    ('M0001R1616878951', 3, -10),
    ('M0001R1616878951', 3, 10),
    ('M0001R1616878951', 3, 10)

查询脚本:

;WITH CTE_ClaimsWithSort AS (
    SELECT
        ClaimID,
        ClaimLine,
        Cost,
        RowNumber   = ROW_NUMBER() OVER(ORDER BY (SELECT NULL))
    FROM
        @vClaims
), CTE_ClaimsFiltered AS (
    SELECT 
        ClaimID,
        ClaimLine,
        Cost,
        RowNumber,
        isDuplicate     = IIF(
                            LAG(ClaimID) OVER(ORDER BY RowNumber) = ClaimID
                            AND LAG(ClaimLine) OVER(ORDER BY RowNumber) = ClaimLine
                            AND LAG(Cost) OVER(ORDER BY RowNumber) = Cost
                        , 1, 0)
    FROM 
        CTE_ClaimsWithSort
)
SELECT 
    ClaimID,
    ClaimLine,
    Cost,
    RowNumber,
    isDuplicate
FROM 
    CTE_ClaimsFiltered
WHERE
    isDuplicate = 0

cte第一部分:为示例数据生成row_numbers。如果您有一个日期列,您可以使用它来代替。
cte第二部分:使用IIF表达式按ClaimID、ClaimLine和Cost查找和过滤重复行
结果是:
| 索赔编号|索赔行|费用|行号|是否重复|
| - ------| - ------| - ------| - ------| - ------|
| 分子量为1616878951|第二章|十个|1个|无|
| 分子量为1616878951|第二章|-10|第二章|无|
| 分子量为1616878951|三个|十个|四个|无|
| 分子量为1616878951|三个|-10|五个|无|
| 分子量为1616878951|三个|十个|六个|无|

相关问题