2013-06-16 3 views
1

У меня есть столбец SQL NVARCHAR (200), который имеет следующие значенияудалить повторяющиеся строки, основанные на подстроке

xxx {"Name":"Stack"} yyy 
    aaa {"Name":"Overflow"} bbb 
    ccc {"Name":Stack"} ddd 
    eee {"Name":"Overflow"} fff 

Я хочу, чтобы удалить первый дубликат строки, где Имя такое же, то есть в приведенном выше примере Я хотел бы удалить 3 и 4 строки, потому что он содержит дублирующее имя, но я хочу сохранить первую строку и вторую строку.

Как я могу это достичь?

+1

Это именно данные действительны, вы ожидаете, чтобы соответствовать '«Имя»:«Стек»и' "Name «: Stack» 'с опечаткой как то же самое? – Hogan

ответ

2

Предполагая, что деталь, которую вы заинтересовали, разделена символом "{" и "}" и что у вас есть идентификатор, чтобы установить порядок (то есть определить, что является первым), тогда вы можете сделать это с относительно прямым запросом ,

Самый внутренний подзапрос находит определение «имя». Следующий уровень присваивает порядковый номер каждому по использованию 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 
+0

Спасибо, Гордон, я забыл упомянуть о сложной части, и это конец} не гарантирует, что он просто содержит« Имя »:« x ». Значение может быть { xxx, yyy} {"Name": "x", "age": 10}, а вторая строка может быть похожа на {x} {"Name": "x"} –