如何基于单列子串合并SQL数据表中满足多字段匹配的同类行
解决方案
你之前的思路问题出在窗口函数的分区规则不对:DENSE_RANK的分区只按零件号前6位划分,只能区分同前6位下的不同四字段组合,没法判断每个组合对应的行数是否满足合并条件。
我们换用COUNT窗口函数直接统计每个符合合并条件的分组行数即可,实现逻辑如下:
- 按「零件号前6位 + 四个Thing字段的完整组合」做分区,统计每个分组的总条数
- 若分组条数≥2,零件号取前6位;否则保留原8位编号
- 最后对结果去重即可得到合并后的数据集
完整SQL代码
SELECT DISTINCT [Part], CASE WHEN group_cnt >= 2 THEN LEFT([Part Num], 6) ELSE [Part Num] END AS [Part Num], Thing1, Thing2, Thing3, Thing4 FROM ( SELECT *, COUNT(*) OVER ( PARTITION BY LEFT([Part Num], 6), Thing1, Thing2, Thing3, Thing4 ) AS group_cnt FROM MyTable ) AS t ORDER BY [Part], [Part Num]
逻辑验证
拿你的测试数据验证:
- 前6位为
101053且四字段为abc/abc/空/空的分组共有2条记录,合并后零件号保留101053 - 前6位为
101053且四字段为abc/abc/abc/空的分组只有1条记录,保留原编号10105324 - 其余分组逻辑同理,最终输出和你给出的预期效果完全一致。
内容的提问来源于stack exchange,提问作者Jeff Brady
相关产品推荐
相关产品推荐

