我正在使用SQL Server。在SQL Server中删除重复项并保留一个条件
我有以下设计的表:
ID bigint
Number varchar(50)
Processed int
我有很多重复的数列
我要删除所有重复的数字,并保持数where processed=1
举例如果我有
Number --- Processed
111 --- 0
111 --- 0
111 --- 1
I要删除所有,并保持最后一个
任何帮助,将不胜感激
我正在使用SQL Server。在SQL Server中删除重复项并保留一个条件
我有以下设计的表:
ID bigint
Number varchar(50)
Processed int
我有很多重复的数列
我要删除所有重复的数字,并保持数where processed=1
举例如果我有
Number --- Processed
111 --- 0
111 --- 0
111 --- 1
I要删除所有,并保持最后一个
任何帮助,将不胜感激
如果你只是想删除其中数等于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
有超过500,000个重复的号码。我可能有所有处理= 0的重复项。我想保留所有重复中的至少一个,但是如果其中一个与处理= 1,则优先级将用于该行。 – HelpASisterOut 2014-10-20 10:19:22
如果您想要处理的第一个条目= 1 – mxix 2014-10-20 10:24:12
这是我会怎么处理这个问题:
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)
您可以将ID订单转换为ASC,其中所有处理的数据都可能重复= 0。我想保留所有重复中的至少一个,但是如果其中一个与处理= 1,则优先级将用于该行。 – HelpASisterOut 2014-10-20 10:22:06
这里有一个方法:
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
。
+1我喜欢这种方法。简单而高效。我在这里检查http://sqlfiddle.com/#!3/925725/4 – 2014-10-20 10:36:30
不错的一个戈登,我做了与row_number相同的逻辑,但我想我复杂的整体语法 – mxix 2014-10-20 10:48:07
你会有任何行只有一次的数字,它没有处理?或者你可以简单地删除处理过的所有内容= 0? – Tanner 2014-10-20 10:15:16
@坦纳我可能有重复处理= 0。我想保留所有重复中的至少一个,但是如果他们有一个处理= 1,那么优先级将是该行的。 – HelpASisterOut 2014-10-20 10:18:43