根据子字符串匹配删除重复的行

时间:2013-06-16 19:46:14

标签: 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行,因为它包含重复的名称,但我想保留第一行和第二行

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:2)

假设您感兴趣的部分由“{”和“}”分隔,并且您有一个id来建立排序(即定义什么是第一个),那么您可以使用相对直接的查询来执行此操作。

最里面的子查询找到“名称”定义。下一级使用row_number()为每个级别分配一个序号,最外层选择第一个:

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