簡體   English   中英

刪除重復項並在SQL Server中保留一個條件

[英]Delete duplicates and keep one with condition in SQL Server

我正在使用SQL Server。

我的桌子設計如下:

ID bigint
Number varchar(50)
Processed int

我在“號碼”列中有很多重復項

我想刪除所有重復的數字,並保留已where processed=1的數字where processed=1

例如,如果我有

Number --- Processed
 111   ---   0
 111   ---   0
 111   ---   1

我要刪除所有並保留最后一個

任何幫助,將不勝感激

這是一種方法:

with todelete as (
      select t.*,
             row_number() over (partition by number order by processed desc) as seqnum
      from table t
     )
delete from todelete
    where seqnum > 1;

row_number() ,將處理為優先級。 邏輯確保即使processed = 1 ,也只剩下一行。

如果您只是嘗試刪除數字等於111且已處理的數字不等於1的行,則可以執行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1

假設ID是連續的,並且您想保留每個數字的最后一行,則可以執行以下操作:

delete from <table> t
left join (
    select
        MAX(ID) filter_ID
    from <table>
    group by
        Number
) filter on
    t.ID = filter.filter_ID
where
    filter.filter_ID is null

保持每個編號至少保留一行,優先於已處理= 1

delete from <table> t
left join (
    select
    ID
    from (
        select
            ROW_NUMBER() OVER (
                PARTITION BY 
                    Number
                ORDER BY
                    Processed DESC,
                    ID DESC
            ) last_R,
            ID
        from <table>
    ) filter
    where
        last_R = 1
) filter on
    t.ID = filter.filter_ID
where
    filter.filter_ID is null

這是解決該問題的方法:

DECLARE @NUM VARCHAR(50)
DECLARE @TAB TABLE
(
    NUMBER VARCHAR(50)
)

INSERT INTO @TAB
SELECT number, from <table> where processed = 0 GROUP BY number HAVING COUNT(number) > 1

DECLARE @IDToKEEP TABLE
(
    id INT
)

WHILE (SELECT COUNT(*) FROM @TAB) > 0
BEGIN
    SELECT TOP 1 @NUM = number FROM @TAB

    INSERT INTO @IDToKEEP
    SELECT TOP 1 id FROM <table> WHERE number = @NUM

    DELETE FROM @TAB WHERE number = @NUM
END

DELETE FROM <table> WHERE processed = 0 AND number IN (SELECT number FROM @TAB) AND id NOT IN (SELECT id FROM @IDToKEEP)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM