我使用的脚本只需要唯一的值。我有一个表格,下面有重复,我需要保留唯一的值(第一次出现),不管括号内是什么。
我可以删除记录并使用单个查询保留唯一记录吗?
输入表
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
答案 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
这是如何运作的:
cte
使用rank()
对name
列中括号外字符串的出现次数进行排名。filtered_cte
仅返回指定字符串每次出现的第一行。在此步骤中,我们得到预期的结果,但不是所需的格式。partition by
和order by
getdate()
函数。选择此函数作为虚拟函数,以便在使用id
函数时为rank
列提供连续值,就像我们在步骤1中所做的那样。演示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小提琴链接