如何删除SQL Server中具有条件的重复行?

时间:2015-08-31 15:14:49

标签: 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

我想删除重复的行但是如果Active有true / false值则保持true值并删除false值。

例如我想要这个列表

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

2 个答案:

答案 0 :(得分:0)

您可以使用以下查询:

;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)

以上假设Active实际上是bit字段。

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

Demo here

答案 1 :(得分:0)

我怀疑您希望每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只保留一条记录,优先保留活动记录。如果所有记录都是假的,那么它将保留具有最大id的假记录。