我有一个这样的表:
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
您可以使用以下查询:
;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
分区中具有的那些。使用a,CTE
我们可以轻松删除所有重复的行,从而过滤掉顶层记录(如果是的话)Active=1
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句