Sql 基于子字符串匹配删除重复行
我有一个sql列nvarchar(200),它有以下值Sql 基于子字符串匹配删除重复行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个sql列nvarchar(200),它有以下值 xxx {"Name":"Stack"} yyy aaa {"Name":"Overflow"} bbb ccc {"Name":Stack"} ddd eee {"Name":"Overflow"} fff 我想删除名称相同的第一个重复行,即在上面的示例中,我想删除3行和4行,因为它包含重复的名称,但我想保留第一行和第二行 如何实现这一点?假设您感兴趣的部分由“{”和“}”分隔,并且您有一个id来建立顺序
xxx {"Name":"Stack"} yyy
aaa {"Name":"Overflow"} bbb
ccc {"Name":Stack"} ddd
eee {"Name":"Overflow"} fff
我想删除名称相同的第一个重复行,即在上面的示例中,我想删除3行和4行,因为它包含重复的名称,但我想保留第一行和第二行
如何实现这一点?假设您感兴趣的部分由“{”和“}”分隔,并且您有一个id来建立顺序(即定义首先是什么),那么您可以通过相对直接的查询来实现这一点 最里面的子查询查找“name”定义。下一级使用
row_number()
为每个on分配一个序列号,最外层选择第一个:
select t.*
from (select t.*,
row_number() over (partition by NamePortion order by id) as seqnum
from (select t.*,
substring(t.col,
charindex('{', t.col),
charindex('}', t.col) - charindex('{', t.col)
) as NamePortion
from t
) t
) t
where seqnum = 1
这些数据是否正确有效,您是否希望匹配拼写相同的
“Name”:“Stack”
和“Name”:Stack”
?谢谢Gordon。我忘了提到棘手的部分,那就是结尾}并不保证它只包含“Name”:“x”。值可以是{xxx,yyy}{“Name”:“x”,“age”:10}第二行可以像{x}{“Name”:“x}