如何使用条件删除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可以省去这个。但我认为这不是他真正想要的。