SQL Server - найдите сходства в столбце и запишите их в новый столбец - PullRequest
0 голосов
/ 27 июня 2019

У меня есть большая таблица с такими данными:

ID  Title
--  ------------------------
1   01_SOMESTRING_038
2   01_SOMESTRING K5038
3   01_SOMESTRING-648
4   K-OTHERSTRING_T_73474
5   K-OTHERSTRING_T_ffk
6   ABC
7   DEF

И теперь задача состоит в том, чтобы найти сходства в этом столбце и написать найденное сходство с новым столбцом.

Таким образом, желаемый результат будет выглядеть так:

ID  Title                     Similarity
--  ------------------------  -----------------
1   01_SOMESTRING_038         01_SOMESTRING
2   01_SOMESTRING K5038       01_SOMESTRING
3   01_SOMESTRING-648         01_SOMESTRING
4   K-OTHERSTRING_T_73474     K-OTHERSTRING_T_
5   K-OTHERSTRING_T_ffk       K-OTHERSTRING_T_
6   ABC                       NULL
7   DEF                       NULL

Как мне добиться этого в MS SQL Server 17? Буду признателен за любую оказанную помощь. Спасибо!

РЕДАКТИРОВАТЬ: Строки не только разделены такими разделителями, как "-", "_". А для обработки конкурирующих сходств я бы установил минимальную длину подобия. Например 10.

1 Ответ

0 голосов
/ 27 июня 2019

Попробуйте следующее, используя рекурсивный CTE для разделения букв, затем мы можем сгруппировать их, чтобы найти наибольшее совпадение:

WITH TITLE_EXPAND AS (
    SELECT
        1 MatchLen
        ,CAST(SUBSTRING(Title,1,1) as NVARCHAR(255)) MatchString
        ,Title
        ,ID
    FROM
        [SourceDataTable]
    UNION ALL
    SELECT 
        MatchLen + 1
        ,CAST(SUBSTRING(Title,1,MatchLen+1) AS NVARCHAR(255))
        ,Title
        ,ID     
    FROM 
        TITLE_EXPAND
    WHERE 
        MatchLen < LEN(Title)
)
SELECT DISTINCT
    SDT.ID
    ,SDT.title
    ,FIRST_VALUE(MatchString) OVER (PARTITION BY SDT.ID ORDER BY SC.MatchLen DESC, SC.MatchCount DESC) Similarity
FROM
    [SourceDataTable] SDT
LEFT JOIN
    (SELECT 
        *
        ,COUNT(*) OVER (PARTITION BY MatchString, MatchLen) MatchCount
    FROM 
        TITLE_EXPAND) SC
ON
    SDT.ID = SC.ID
    AND
    SC.MatchCount > 1
ORDER BY SDT.ID

Где SourceDataTable - ваша исходная таблица. Значение подобия будет самым подходящим аналогичным значением.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...