使用条件删除重复记录

时间:2014-04-13 14:46:26

标签: sql sql-server sql-server-2008 tsql

我使用的脚本只需要唯一的值。我有一个表格,下面有重复,我需要保留唯一的值(第一次出现),不管括号内是什么。

我可以删除记录并使用单个查询保留唯一记录吗?

输入表

ID  Name        
1   (Del)testing    
2   (Del)test       
3   (Delete)testing 
4   (Delete)tester      
5   (Del)tst        
6   (Delete)tst     

因此输出表应该类似于

输入表

ID  Name        
1   (Del)testing    
2   (Del)test       
3   (Delete) tester     
4   (Del)tst        

4 个答案:

答案 0 :(得分:0)

SELECT DISTINCT * FROM FOO;

如果您只需要更改删除,则需要检索多少数据?> Del您可以尝试使用REPLACE

http://technet.microsoft.com/en-us/library/ms186862.aspx


分组功能也可以帮助你


我认为这不容易查询

答案 1 :(得分:0)

假设:name列始终包含样本数据中给出的格式的所有字符串。

试试这个:

;with cte as
(select *, rank() over 
 (partition by substring(name, charindex(')',name)+1,len(name)+1 - charindex(')',name))
 order by id) rn
 from tbl
),

filtered_cte as
(select * from cte
 where rn = 1
)

select rank() over (partition by getdate() order by id,getdate()) id , name
from filtered_cte

这是如何运作的:

  1. 第一个CTE cte使用rank()name列中括号外字符串的出现次数进行排名。
  2. 第二个CTE filtered_cte仅返回指定字符串每次出现的第一行。在此步骤中,我们得到预期的结果,但不是所需的格式。
  3. 在此步骤中,我们partition byorder by getdate()函数。选择此函数作为虚拟函数,以便在使用id函数时为rank列提供连续值,就像我们在步骤1中所做的那样。
  4. 演示here

    请注意,此解决方案将返回已过滤的值,但不会删除源表中的任何内容。如果您愿意,可以从步骤1中创建的CTE中删除以从源表中删除数据。

答案 2 :(得分:0)

首先使用此更新使其统一

Update table set name = replace(Name, '(Del)' , '(Delete)')

然后删除重复的名称

Delete from table where id in
(Select id from (Select Row_Number() over(Partition by Name order by id) as rn,* from table) x
where rn > 1)   

答案 3 :(得分:0)

首先创建输入日期表     CREATE TABLE测试     (ID int,Name varchar(20));

INSERT INTO test
(`ID`, `Name`)
VALUES
(1,  '(Del)testing'),
(2, '(Del)test'),
(3,  '(Delete)testing'),
(4,  '(Delete)tester'),
(5, '(Del)tst'),
    (6, '(Delete)tst');

选择查询

select id,  name
from (
select id,  name ,
ROW_NUMBER() OVER(PARTITION BY substring(name,PATINDEX('%)%',name)+1,20) ORDER BY name) rn 
from test ) t
where rn= 1 
order by 1

SQL小提琴链接

http://www.sqlfiddle.com/#!6/a02b0/34