删除重复项并在SQL Server中保留一个条件

时间:2014-10-20 10:04:48

标签: sql sql-server sql-server-2008

我正在使用SQL Server。

我的桌子有以下设计:

ID bigint
Number varchar(50)
Processed int

我在Number列

中有很多重复项

我想删除所有重复的号码,并保留号码where processed=1

例如,如果我有

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

我想删除所有内容并保留最后一个

任何帮助将不胜感激

3 个答案:

答案 0 :(得分:2)

这是一种方法:

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

答案 1 :(得分: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

每个Number至少保留一行优先级为Processed = 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

答案 2 :(得分:0)

以下是我将如何处理此问题:

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)