SQL Server-在列中查找相似之处并将其写入新列

时间:2019-06-27 06:50:31

标签: sql sql-server

我有一张大桌子,上面有这样的数据:

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 :(得分:0)

尝试以下操作,使用递归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是您的源表。相似度值将是最长的相似度值。