如何筛选含完整供应商名称与编码的行?批量处理表DQ问题咨询
数据质量处理:筛选含供应商名称及编码的有效行
核心需求
从存在重复行的业务表中,筛选出**SUPPLIER字段同时包含供应商名称和编码(格式如XXX (XXXX))**的记录,排除缺失编码或显示为Not Known的行,适配数千种产品的批量处理。
最优处理方案(SQL实现)
1. 基础筛选逻辑
通过正则匹配SUPPLIER字段的格式,确保包含括号包裹的数字编码,同时排除无效值:
SELECT * FROM your_table_name WHERE SUPPLIER != 'Not Known' AND SUPPLIER REGEXP '^.+\\([0-9]+\\)$';
说明:
REGEXP '^.+\\([0-9]+\\)$'匹配「任意字符开头 + 括号包裹数字结尾」的字符串,精准定位带编码的供应商记录。
2. 重复行处理
针对表中重复行,提供两种高效去重方式:
方式1:保留所有字段去重
适合需要完整保留所有字段的场景:
SELECT DISTINCT * FROM your_table_name WHERE SUPPLIER != 'Not Known' AND SUPPLIER REGEXP '^.+\\([0-9]+\\)$';
方式2:按核心字段分组去重(大数据量首选)
通过分组聚合减少重复计算,性能优于DISTINCT:
SELECT NK_1, PRODUCT, SUPPLIER, MAX(HASH) AS HASH FROM your_table_name WHERE SUPPLIER != 'Not Known' AND SUPPLIER REGEXP '^.+\\([0-9]+\\)$' GROUP BY NK_1, PRODUCT, SUPPLIER;
3. 大数据量性能优化
- 添加专用索引:如果数据库支持表达式索引,提前创建索引加速筛选:
-- PostgreSQL示例 CREATE INDEX idx_supplier_valid ON your_table_name (SUPPLIER) WHERE SUPPLIER != 'Not Known' AND SUPPLIER ~ '^.+\\([0-9]+\\)$'; - 分步过滤:先排除
Not Known再做正则匹配,减少正则处理的数据量:SELECT DISTINCT * FROM ( SELECT * FROM your_table_name WHERE SUPPLIER != 'Not Known' ) t WHERE t.SUPPLIER REGEXP '^.+\\([0-9]+\\)$';
内容的提问来源于stack exchange,提问作者TheLoneGrape
相关产品推荐
相关产品推荐

