基于条件移除物料分组的SQL查询优化需求
解决方案:筛选仅含DOCK位置的物料记录
要实现你要的逻辑,核心是先定位那些「脚踏两条船」的物料——也就是同时有DOCK位置和符合111-111-111-11格式非DOCK位置的物料,然后把这些物料的所有记录全删掉,只留那些所有位置都是DOCK的物料。
假设你的源表叫inventory,包含字段project_id(指定项目ID)、customer、material、license_plate、location,可以这么写SQL:
WITH excluded_materials AS ( SELECT material FROM inventory WHERE project_id = 'TARGET_PROJECT' -- 替换成你要查询的项目ID GROUP BY material HAVING -- 该物料存在至少一条DOCK位置的记录 SUM(CASE WHEN location = 'DOCK' THEN 1 ELSE 0 END) > 0 -- 同时存在至少一条符合格式的非DOCK位置记录 AND SUM(CASE WHEN location != 'DOCK' AND location REGEXP '^[0-9]{3}-[0-9]{3}-[0-9]{3}-[0-9]{2}$' THEN 1 ELSE 0 END) > 0 ) SELECT customer, material, license_plate, location FROM inventory WHERE project_id = 'TARGET_PROJECT' AND material NOT IN (SELECT material FROM excluded_materials) AND location = 'DOCK'; -- 确保最终只保留DOCK位置的记录
关键点说明:
- 排除逻辑:通过CTE
excluded_materials分组检查每个物料的位置情况,把同时满足两个条件的物料标记为需要排除的对象。 - 正则兼容:如果你的数据库不支持
REGEXP(比如SQL Server),可以把正则条件换成LIKE模式:location LIKE '[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9]' - 最终过滤:最后加上
location = 'DOCK'是为了确保结果里只有DOCK位置的记录——毕竟有些物料可能全是符合格式的非DOCK位置,这类也不是我们要的,直接过滤掉。
内容的提问来源于stack exchange,提问作者FunCoder
相关产品推荐
相关产品推荐

