我有一个名为status的表,其中包含如下数据:
ID Status Number
1 S 1
1 p 2
1 S 3
1 C 4
2 S 5
2 R 6
我想摆脱这个表中的重复项,所以我在这个表中添加了另一个名为Flag的列,我为所有记录设置为1。现在我的表看起来像这样:
ID Status Number Flag
1 S 1 Y
1 p 2 Y
1 S 3 Y
1 C 4 Y
2 S 5 Y
2 R 6 Y
我正在写一个更新查询,如果它有重复项并且更新查询是,则将标志列更新为N.
Number列是表中的标识。
udate status
set flag = 'N'
where flag = 'Y' and Number in
(select min(Number) from status
where id = 1
having count(*) >1)
所以,如果我这个查询它给了我没有重复的数据
Select status from status
where flag = Y
但是如果我有3个类似的状态值,则更新查询不起作用。仅当我有2个类似的状态值时,更新才有效。
有人可以建议我这样做吗?
答案 0 :(得分:2)
使用此标记仅标记重复项(保持第一个值不变):
WITH q AS
(
SELECT *, ROW_NUMBER() OVER (PARTITION BY id, status ORDER BY number) AS rn
FROM status
)
UPDATE q
SET flag = CASE rn WHEN 1 THEN 'Y' ELSE 'N' END
或以此标记所有具有重复项的值:
WITH q AS
(
SELECT *, COUNT(*) OVER (PARTITION BY id, status) AS cnt
FROM status
)
UPDATE q
SET flag = CASE cnt WHEN 1 THEN 'Y' ELSE 'N' END
答案 1 :(得分:0)
您可以使用row_number()
选择特定分区的第一行:
update t
set flag = case when rn = 1 then 'Y' else 'N' end
from (
select ROW_NUMBER() over (partition by status order by number) as rn
, *
from @t
) t