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

在SQL Server中删除重复项并保留一个符合条件的项,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我正在使用SQL Server 我有一张设计如下的桌子: ID bigint Number varchar(50) Processed int 我在“数字”列中有很多重复项 我想删除所有重复的数字,并保留处理为1的数字 例如,如果我有 Number --- Processed 111 --- 0 111 --- 0 111 --- 1 我想删除所有并保留最后一个 如果您只是试图删除数字等于111且处理的行不等于1的行,请提供帮助,您可以执行以下操作: delet

我正在使用SQL Server

我有一张设计如下的桌子:

ID bigint
Number varchar(50)
Processed int
我在“数字”列中有很多重复项

我想删除所有重复的数字,并保留处理为1的数字

例如,如果我有

Number --- Processed
 111   ---   0
 111   ---   0
 111   ---   1
我想删除所有并保留最后一个


如果您只是试图删除数字等于111且处理的行不等于1的行,请提供帮助,您可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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
假设ID是连续的,并且您希望为每个数字保留最后一行,您可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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

如果您只是尝试删除其中number等于111且processed不等于1的行,则可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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
假设ID是连续的,并且您希望为每个数字保留最后一行,您可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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

如果您只是尝试删除其中number等于111且processed不等于1的行,则可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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
假设ID是连续的,并且您希望为每个数字保留最后一行,您可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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

如果您只是尝试删除其中number等于111且processed不等于1的行,则可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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
假设ID是连续的,并且您希望为每个数字保留最后一行,您可以执行以下操作:

delete from <table>
where
 Number = 111 and
 Processed <> 1
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)

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

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)

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

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)

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

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)
这里有一种方法:

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;
行编号使用已处理的行作为优先级来枚举行。该逻辑确保只保留一行,即使没有一行处理=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;
行编号使用已处理的行作为优先级来枚举行。该逻辑确保只保留一行,即使没有一行处理=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;
行编号使用已处理的行作为优先级来枚举行。该逻辑确保只保留一行,即使没有一行处理=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;


行编号使用已处理的行作为优先级来枚举行。该逻辑确保仅保留一行,即使没有一行已处理=1。

是否有任何行的数字仅存在一次而未处理?或者你可以简单地删除处理为0的所有内容吗?@Tanner我可能在处理为0的地方有重复的内容。我想保留所有副本中的至少一个,但如果它们有一个已处理=1的副本,则该行的优先级将为该行。是否有任何行的数字仅存在一次而未处理?或者你可以简单地删除处理为0的所有内容吗?@Tanner我可能在处理为0的地方有重复的内容。我想保留所有副本中的至少一个,但如果它们有一个已处理=1的副本,则该行的优先级将为该行。是否有任何行的数字仅存在一次而未处理?或者你可以简单地删除处理为0的所有内容吗?@Tanner我可能在处理为0的地方有重复的内容。我想保留所有副本中的至少一个,但如果它们有一个已处理=1的副本,则该行的优先级将为该行。是否有任何行的数字仅存在一次而未处理?或者你可以简单地删除处理为0的所有内容吗?@Tanner我可能在处理为0的地方有重复的内容。我想保留至少一个副本,但如果它们有一个已处理=1的副本,则该行的优先级为。有50多万个重复的数字。我可能有重复的,其中所有已处理=0。我想保留所有重复项中的至少一个,但如果其中一个已处理=1,则该行的优先级将为该行。如果要处理=1的第一个条目,则可以将ID顺序颠倒为ASC。重复的数字超过50万个。我可能有重复的,其中所有已处理=0。我想保留所有重复项中的至少一个,但如果其中一个已处理=1,则该行的优先级将为该行。如果要处理=1的第一个条目,则可以将ID顺序颠倒为ASC。重复的数字超过50万个。我可能有重复的,其中所有已处理=0。我想保留所有重复项中的至少一个,但如果其中一个已处理=1,则该行的优先级将为该行。如果要处理=1的第一个条目,则可以将ID顺序颠倒为ASC。重复的数字超过50万个。我可能有重复的,其中所有已处理=0。我想保留至少一个副本,但如果其中一个副本的处理时间=1,则该行的优先级将为该行。如果希望处理时间=1的第一个条目,则可以将ID顺序反转为ASC。如果所有p
已处理=0。我想保留至少一个副本,但如果其中一个副本的处理时间=1,则该行的优先级将为。我可能会保留所有已处理时间=0的副本。我想保留至少一个副本,但如果其中一个副本的处理时间=1,则该行的优先级将为。我可能会保留所有已处理时间=0的副本。我想保留至少一个副本,但如果其中一个副本的处理时间=1,则该行的优先级将为。我可能会保留所有已处理时间=0的副本。我想保留所有副本中的至少一个,但如果其中一个已处理=1,则该行的优先级将为+1。我喜欢这种方法。简单高效。我在这里检查了一下很好Gordon,我对行数做了同样的逻辑,但是我想我把整个语法复杂化了+1我喜欢这种方法。简单高效。我在这里检查了一下很好Gordon,我对行数做了同样的逻辑,但是我想我把整个语法复杂化了+1我喜欢这种方法。简单高效。我在这里检查了一下很好Gordon,我对行数做了同样的逻辑,但是我想我把整个语法复杂化了+1我喜欢这种方法。简单高效。我在这里检查过了很好Gordon,我对行号做了同样的逻辑,但我想我把整个语法复杂化了