如何使用条件删除SQL Server中的重复行?

如何使用条件删除SQL Server中的重复行?,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我有一张这样的桌子: Id GroupId StdId Active --------------------------- 1 1 1 true 2 1 2 false 3 1 1 false 4 1 1 false 5 1 1 true 6 1 2 true 我想删除重复的行,但如果活动,则有真/假值保留

我有一张这样的桌子:

Id   GroupId  StdId  Active
---------------------------
1    1        1      true
2    1        2      false
3    1        1      false
4    1        1      false
5    1        1      true
6    1        2      true
我想删除重复的行,但如果活动,则有真/假值保留真值并删除假值

例如,我想要这个列表

Id   GroupId  StdId  Active
---------------------------
1    1        1      true
6    1        2      true

您可以使用以下查询:

;WITH ToDelete AS (
  SELECT Id, GroupId, StdId, Active,
         ROW_NUMBER() OVER (PARTITION BY GroupId, StdId
                            ORDER BY Active Desc, Id) AS rn
  FROM mytable 
)
DELETE FROM ToDelete
WHERE (rn > 1) OR (rn =1 AND Active = 0)
以上假设
活动
实际上是一个
字段

行编号
帮助我们识别重复记录。在每个
GroupId、StdId
分区中,具有
Active=1
的分区将优先于具有
Active=0
的分区。使用
CTE
我们可以轻松删除所有重复的行,过滤掉顶层记录,以防它是
Active=1
记录


您可以使用以下查询:

;WITH ToDelete AS (
  SELECT Id, GroupId, StdId, Active,
         ROW_NUMBER() OVER (PARTITION BY GroupId, StdId
                            ORDER BY Active Desc, Id) AS rn
  FROM mytable 
)
DELETE FROM ToDelete
WHERE (rn > 1) OR (rn =1 AND Active = 0)
以上假设
活动
实际上是一个
字段

行编号
帮助我们识别重复记录。在每个
GroupId、StdId
分区中,具有
Active=1
的分区将优先于具有
Active=0
的分区。使用
CTE
我们可以轻松删除所有重复的行,过滤掉顶层记录,以防它是
Active=1
记录


我怀疑您希望每个
StdId
保留一行,并优先选择真正的行。如果是:

with todelete as (
      select t.*,
             row_number() over (partition by groupid order by active desc, id desc) as seqnum
      from table t
     )
delete from todelete
    where seqnum = 1;

这样,每个
stdId
只保留一条记录,优先保留一条活动记录。如果所有记录都为false,那么它将保留id最大的false记录。

我怀疑您希望每个
StdId
保留一行,并优先选择true行。如果是:

with todelete as (
      select t.*,
             row_number() over (partition by groupid order by active desc, id desc) as seqnum
      from table t
     )
delete from todelete
    where seqnum = 1;

这样,每个
stdId
只保留一条记录,优先保留一条活动记录。如果所有记录都为false,那么它将保留id最大的false记录。

如果给定集合的所有活动标志都为false,您希望发生什么?如果给定集合的所有活动标志都为false,您希望发生什么?@GordonLinoff是的,我知道,这就是为什么我添加了一个编辑
(rn=1和active=0)
谓词。如果总想留下一张唱片的话,OP可以省去这个。但我认为这不是他真正想要的。@GordonLinoff是的,我知道,这就是为什么我添加了一个编辑
(rn=1和Active=0)
谓词的原因。如果总想留下一张唱片的话,OP可以省去这个。但我认为这不是他真正想要的。