You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL中匹配非完全相同的字符串列?附实操案例

原Jobs表

Job职位名称月末日期
36950704Senior Full Stack Developer (React Native)2022-01-31
36953479Senior Full Stack Developer (React Native) 22022-01-31
36953482Senior Full Stack Developer (React) 32022-01-31
37131847Senior Software Developer (.NET Core, Angular)2022-03-31
37132156Senior Software Developer (.NET Core, Angular) 22022-03-31
37132174Senior Software Developer (.NET Core, Angular) 32022-03-31
37132177Senior Software Developer (.NET Core, Angular) 42022-03-31
37309773Senior Software Developer (FinTech)2022-05-31
37309830Senior Software Developer (FinTech) 22022-05-31
37116394Senior .NET Developer (Windows Forms)2022-03-31

需求说明

同一月末日期下存在一组职位名称相似的空缺(部分名称带数字后缀区分),需新增关联职位ID列,将每组职位关联到组内最小的Job ID(即该组的基准职位ID)。

例如2022-01-31的3个职位:

  • Senior Full Stack Developer (React Native)
  • Senior Full Stack Developer (React Native) 2
  • Senior Full Stack Developer (React) 3
    均需关联到基准职位ID:36950704。

期望输出

Job职位名称月末日期关联职位ID
36950704Senior Full Stack Developer (React Native)2022-01-3136950704
36953479Senior Full Stack Developer (React Native) 22022-01-3136950704
36953482Senior Full Stack Developer (React) 32022-01-3136950704
37131847Senior Software Developer (.NET Core, Angular)2022-03-3137131847
37132156Senior Software Developer (.NET Core, Angular) 22022-03-3137131847
37132174Senior Software Developer (.NET Core, Angular) 32022-03-3137131847
37132177Senior Software Developer (.NET Core, Angular) 42022-03-3137131847
37309773Senior Software Developer (FinTech)2022-05-3137309773
37309830Senior Software Developer (FinTech) 22022-05-3137309773
37116394Senior .NET Developer (Windows Forms)2022-03-3137116394

SQL实现方案

核心逻辑是先为每个月末日期下的相似标题分组,再取每组最小的Job ID作为关联值。

示例代码(SQL Server)

WITH JobGroups AS (
    SELECT 
        EndOfMonth,
        -- 提取基准标题:移除末尾数字后缀
        CASE 
            WHEN RIGHT(Title, CHARINDEX(' ', REVERSE(Title)) - 1) LIKE '%[0-9]' 
            THEN LEFT(Title, LEN(Title) - CHARINDEX(' ', REVERSE(Title)))
            ELSE Title
        END AS BaseTitle,
        MIN(Job) AS RelatedJob
    FROM Jobs
    GROUP BY 
        EndOfMonth,
        CASE 
            WHEN RIGHT(Title, CHARINDEX(' ', REVERSE(Title)) - 1) LIKE '%[0-9]' 
            THEN LEFT(Title, LEN(Title) - CHARINDEX(' ', REVERSE(Title)))
            ELSE Title
        END
)
SELECT 
    j.Job,
    j.Title,
    j.EndOfMonth,
    jg.RelatedJob AS [关联职位ID]
FROM Jobs j
JOIN JobGroups jg 
    ON j.EndOfMonth = jg.EndOfMonth
    AND (
        (RIGHT(j.Title, CHARINDEX(' ', REVERSE(j.Title)) - 1) LIKE '%[0-9]' 
         AND LEFT(j.Title, LEN(j.Title) - CHARINDEX(' ', REVERSE(j.Title))) = jg.BaseTitle)
        OR (RIGHT(j.Title, CHARINDEX(' ', REVERSE(j.Title)) - 1) NOT LIKE '%[0-9]' 
            AND j.Title = jg.BaseTitle)
    )
ORDER BY j.EndOfMonth, j.Job;

代码说明

  1. JobGroups公用表表达式:处理每个职位名称,移除末尾数字后缀得到基准标题,再按月末日期和基准标题分组,计算每组最小的Job ID。
  2. 主查询将原表与分组结果关联,匹配日期和基准标题,为每个职位填充关联职位ID。

内容的提问来源于stack exchange,提问作者Bilal Shafqat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 01:31:21