2013-04-12 2 views
1

У меня есть таблица с двумя столбцами NVARCHAR: источник и цель.Как найти частичные дубликаты?

Я хочу найти строки, для которых вы можете найти другую строку с тем же источником и целью, содержащей текущий.

В приведенном ниже примере, я хочу найти строки 1 и 7:

  • Строка 1 "частичный дубликат" из строки 3
  • Строка 7 представляет собой "частичное дубликат" из строки 6

Вот фрагмент кода SQL:

CREATE TABLE #YourTable (ID int, [source] nvarCHAR(12), [target] nvarCHAR(12)) 

INSERT INTO #YourTable ([ID],[source],[target]) VALUES (1,'wordA','word1') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (2,'wordA','word2') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (3,'wordA','word3 ; word1') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (4,'wordB','word4') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (5,'wordC','word5') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (6,'wordD','word6 ; word7') 
INSERT INTO #YourTable ([ID],[source],[target]) VALUES (7,'wordD','word7') 

SELECT 
    [source], 
    STUFF((
    SELECT ', ' + [target] 
    FROM #YourTable 
    WHERE ([source] = Results.[source]) 
    FOR XML PATH ('')) 
    ,1,2,'') AS NameValues 
FROM #YourTable Results 
GROUP BY [source] 
HAVING COUNT(1)>1 

DROP TABLE #YourTable 

Моя первая идея была конкатенации, но это не приближает меня к решению ...

Я могу экспортировать свои данные в CSV и работать с языком программирования (python, C#, ...), чтобы изолировать идентификаторы, но мне любопытно чтобы увидеть, как это можно сделать в SQL.

Конечной целью является удаление «частичных дубликатов».

ответ

1

ваша работа может быть сделано с помощью оператора: exists

delete 
    from #yourtable t1 
where exists (
      select 1 
      from #yourtable t2 
      where t2.source = t1.source 
      and t2.target <> t1.target 
      and t2.target like t1.target || '%' 
     ) 
    ; 
+0

Я изменил 'и t2.target как t1.target || 'target' + '%' или t2. [target] как t1. [target] + '%' или t2. [target] like '%' + t1. [target]) '. –

+1

'и (t2. [Target] как '%' + t1. [Target] + '%'' будет достаточным, так как ''% ''соответствует пустой строке (что является причиной наличия' и t2.target <> t1.target' внутри предложения 'where') – collapsar

Смежные вопросы