我有一张这样的表:
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
答案 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
。
答案 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的假记录。