[英]Delete duplicates and keep one with condition in SQL Server
我正在使用SQL Server。
我的桌子設計如下:
ID bigint
Number varchar(50)
Processed int
我在“號碼”列中有很多重復項
我想刪除所有重復的數字,並保留已where processed=1
的數字where processed=1
例如,如果我有
Number --- Processed
111 --- 0
111 --- 0
111 --- 1
我要刪除所有並保留最后一個
任何幫助,將不勝感激
這是一種方法:
with todelete as (
select t.*,
row_number() over (partition by number order by processed desc) as seqnum
from table t
)
delete from todelete
where seqnum > 1;
row_number()
,將處理為優先級。 邏輯確保即使processed = 1
,也只剩下一行。
如果您只是嘗試刪除數字等於111且已處理的數字不等於1的行,則可以執行以下操作:
delete from <table>
where
Number = 111 and
Processed <> 1
假設ID是連續的,並且您想保留每個數字的最后一行,則可以執行以下操作:
delete from <table> t
left join (
select
MAX(ID) filter_ID
from <table>
group by
Number
) filter on
t.ID = filter.filter_ID
where
filter.filter_ID is null
保持每個編號至少保留一行,優先於已處理= 1
delete from <table> t
left join (
select
ID
from (
select
ROW_NUMBER() OVER (
PARTITION BY
Number
ORDER BY
Processed DESC,
ID DESC
) last_R,
ID
from <table>
) filter
where
last_R = 1
) filter on
t.ID = filter.filter_ID
where
filter.filter_ID is null
這是解決該問題的方法:
DECLARE @NUM VARCHAR(50)
DECLARE @TAB TABLE
(
NUMBER VARCHAR(50)
)
INSERT INTO @TAB
SELECT number, from <table> where processed = 0 GROUP BY number HAVING COUNT(number) > 1
DECLARE @IDToKEEP TABLE
(
id INT
)
WHILE (SELECT COUNT(*) FROM @TAB) > 0
BEGIN
SELECT TOP 1 @NUM = number FROM @TAB
INSERT INTO @IDToKEEP
SELECT TOP 1 id FROM <table> WHERE number = @NUM
DELETE FROM @TAB WHERE number = @NUM
END
DELETE FROM <table> WHERE processed = 0 AND number IN (SELECT number FROM @TAB) AND id NOT IN (SELECT id FROM @IDToKEEP)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.