Как найти повторяющуюся строку, когда любое одно слово из столбца desc соответствует группе - PullRequest
0 голосов
/ 20 октября 2018

У меня есть такой результат:

enter image description here

Мне нужно обновить столбец «флаг» как дубликат, когда любое одно слово из строки соответствуетвторой ряд в группе столбца "mfgid".

--test dataset
declare @table as table
        (id int,
         mfgid int,
         [desc] varchar(100))
insert into @table
values  (1,111,'abc xyz pqr'),
        (2,111,'abc tyu fgh'),
        (3,222,'abc pqr'),
        (4,222,'lmn stu'),
        (5,333,'pqr spd hki abc'),
        (6,333,'lmn jsk pqr klo')

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 20 октября 2018

Это предполагает, что OP использует SQL Server 2016+, так как они не сообщили нам версию:

WITH Split AS(
    SELECT T.id,
           T.mfgid,
           T.[desc],
           SS.[value]
    FROM @table T
        CROSS APPLY STRING_SPLIT([desc],' ') SS)
SELECT S.id,
       S.mfgid,
       S.[desc],
       CASE MAX(Dups) WHEN 0 THEN NULL ELSE 'Duplicate' END AS Flag
FROM Split S
     CROSS APPLY (SELECT COUNT(*) AS [Dups]
                  FROM Split ca
                  WHERE ca.mfgid = S.mfgid
                    AND ca.[value] = S.[value]
                    AND ca.id != S.id) C
GROUP BY S.id,
         S.mfgid,
         S.[desc];
0 голосов
/ 20 октября 2018

Вот возможное решение

WITH K AS
(
SELECT mfgid, 
       value, 
       count(*) over ( partition by mfgid, value order by mfgid) Dups 
FROM @Table cross apply STRING_SPLIT([desc], ' ')
)
SELECT T.*, 
       IIF(
            EXISTS(SELECT 1 FROM K WHERE K.mfgid = T.mfgid AND K.Dups > 1), 
            'Duplicte', 
            ''
          ) Flag
FROM @Table T;

Результаты:

+----+-------+-----------------+----------+
| id | mfgid |      desc       |   Flag   |
+----+-------+-----------------+----------+
|  1 |   111 | abc xyz pqr     | Duplicte |
|  2 |   111 | abc tyu fgh     | Duplicte |
|  3 |   222 | abc pqr         |          |
|  4 |   222 | lmn stu         |          |
|  5 |   333 | pqr spd hki abc | Duplicte |
|  6 |   333 | lmn jsk pqr klo | Duplicte |
+----+-------+-----------------+----------+

Демо

0 голосов
/ 20 октября 2018

два возможных решения ниже:

--test dataset
declare @table as table
        (id int,
         mfgid int,
         [desc] varchar(100))
insert into @table
values  (1,111,'abc xyz pqr'),
        (2,111,'abc tyu fgh'),
        (3,222,'abc pqr'),
        (4,222,'lmn stu'),
        (5,333,'pqr spd hki abc'),
        (6,333,'lmn jsk pqr klo')

Решение 1: Если в строке только 4 слова (на основе вашего скриншота)

 ;with cte2 as
       (select *
        from (select id,
                     mfgid,
                     parsename(replace(s.[desc],' ','.'),1) as [a1],
                     parsename(replace(s.[desc],' ','.'),2) as [a2],
                     parsename(replace(s.[desc],' ','.'),3) as [a3],
                     parsename(replace(s.[desc],' ','.'),4) as [a4]
              from @table as s) as a
        unpivot (testval FOR val IN (a1, a2, a3, a4)) unpvt
        )

 select m.id, m.mfgid, m.[desc], t.flag
 from @table as m
 outer apply
    (select top (1) 'duplicate' as flag 
     from cte2 as a 
        join cte2 as b 
            on a.mfgid = b.mfgid
               and a.id != b.id
               and a.testval = b.testval
               and m.mfgid = a.mfgid) as t

тест здесь

Решение 2: Если у вас более 4слова в строке

;with cte as
      ( select t.*, s.[value] 
        from @table as t
             cross apply 
                (select ltrim(rtrim(split.a.value('.','varchar(100)'))) as [value]
                 from (select cast('<M>'+replace([desc],' ','</M><M>')+'</M>' as xml) as data) as a 
                 cross apply data.nodes ('/M') as split(a)
                 ) as s
      )

select m.id, m.mfgid, m.[desc], t.flag
from @table as m
     outer apply
        (select top (1) 'duplicate' as flag
         from cte as a 
            join cte as b 
                on a.mfgid = b.mfgid
                   and a.id != b.id
                   and a.Value = b.Value
                   and m.mfgid = a.mfgid) as t

тест здесь

...