Sql 基于子字符串匹配删除重复行

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来建立顺序

我有一个sql列nvarchar(200),它有以下值

    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}