如何查找ProductsTable中前缀带不同数量0的重复商品条目
我的ProductsTable数据如下,存在同一商品对应不同编号的情况,有时商品描述也会存在细微差异
ItemNo ItemDescripition Stock Price 0012500 苹果 10 20 0012601 香蕉 5 15 012500 苹果 10 18 00012500 苹果 10 16 00AM0120 芒果 10 11 AM0120 芒果 10 12 000AM0120 芒果 10 15 我需要从表中找出所有存在细微差异的重复商品,比如部分商品编号开头带2个0,部分带3个0。
以上表格仅作参考,我的实际表约有25000行数据,商品编号为varchar类型,部分商品编号为字母数字混合格式。
解决方案
处理前导零导致的编号重复
对商品编号做标准化,去掉开头所有前导零后分组,即可快速筛选出同商品不同编号的重复记录,该方案兼容字母数字混合的编号格式,不会修改编号中非前导零的数字和字母内容。
MySQL语法示例:
SELECT TRIM(LEADING '0' FROM ItemNo) AS 标准化后商品编号, GROUP_CONCAT(DISTINCT ItemNo) AS 所有原始商品编号, GROUP_CONCAT(DISTINCT ItemDescripition) AS 对应商品描述, COUNT(*) AS 重复记录数 FROM ProductsTable GROUP BY 标准化后商品编号 HAVING 重复记录数 > 1 ORDER BY 重复记录数 DESC;
其他数据库适配:
- SQL Server:替换标准化逻辑为
SUBSTRING(ItemNo, PATINDEX('%[^0]%', ItemNo + 'x'), LEN(ItemNo)) - PostgreSQL:替换标准化逻辑为
LTRIM(ItemNo, '0')
处理描述细微差异导致的重复
如果是存在空格、大小写、全半角符号这类简单差异,先标准化描述后分组即可:
SELECT LOWER(REPLACE(REPLACE(ItemDescripition, ' ', ''), ' ', '')) AS 标准化后商品描述, GROUP_CONCAT(DISTINCT ItemDescripition) AS 所有原始描述, GROUP_CONCAT(DISTINCT ItemNo) AS 对应商品编号, COUNT(*) AS 重复记录数 FROM ProductsTable GROUP BY 标准化后商品描述 HAVING 重复记录数 > 1;
如果存在错别字、多余修饰词这类更复杂的差异,可以引入Levenshtein编辑距离函数,筛选两个描述编辑距离≤3的记录即可匹配相似度较高的重复商品,25000行的数据量运算压力极低,不需要额外优化。
内容的提问来源于stack exchange,提问作者MMB
相关产品推荐
相关产品推荐

