如何在SQL中匹配非完全相同的字符串列?附实操案例
原Jobs表
| Job | 职位名称 | 月末日期 |
|---|---|---|
| 36950704 | Senior Full Stack Developer (React Native) | 2022-01-31 |
| 36953479 | Senior Full Stack Developer (React Native) 2 | 2022-01-31 |
| 36953482 | Senior Full Stack Developer (React) 3 | 2022-01-31 |
| 37131847 | Senior Software Developer (.NET Core, Angular) | 2022-03-31 |
| 37132156 | Senior Software Developer (.NET Core, Angular) 2 | 2022-03-31 |
| 37132174 | Senior Software Developer (.NET Core, Angular) 3 | 2022-03-31 |
| 37132177 | Senior Software Developer (.NET Core, Angular) 4 | 2022-03-31 |
| 37309773 | Senior Software Developer (FinTech) | 2022-05-31 |
| 37309830 | Senior Software Developer (FinTech) 2 | 2022-05-31 |
| 37116394 | Senior .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 |
|---|---|---|---|
| 36950704 | Senior Full Stack Developer (React Native) | 2022-01-31 | 36950704 |
| 36953479 | Senior Full Stack Developer (React Native) 2 | 2022-01-31 | 36950704 |
| 36953482 | Senior Full Stack Developer (React) 3 | 2022-01-31 | 36950704 |
| 37131847 | Senior Software Developer (.NET Core, Angular) | 2022-03-31 | 37131847 |
| 37132156 | Senior Software Developer (.NET Core, Angular) 2 | 2022-03-31 | 37131847 |
| 37132174 | Senior Software Developer (.NET Core, Angular) 3 | 2022-03-31 | 37131847 |
| 37132177 | Senior Software Developer (.NET Core, Angular) 4 | 2022-03-31 | 37131847 |
| 37309773 | Senior Software Developer (FinTech) | 2022-05-31 | 37309773 |
| 37309830 | Senior Software Developer (FinTech) 2 | 2022-05-31 | 37309773 |
| 37116394 | Senior .NET Developer (Windows Forms) | 2022-03-31 | 37116394 |
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;
代码说明
JobGroups公用表表达式:处理每个职位名称,移除末尾数字后缀得到基准标题,再按月末日期和基准标题分组,计算每组最小的JobID。- 主查询将原表与分组结果关联,匹配日期和基准标题,为每个职位填充
关联职位ID。
内容的提问来源于stack exchange,提问作者Bilal Shafqat
相关产品推荐
相关产品推荐

