SQL Server 从wohead表获取符合条件的各part_code最新工单记录
原SQL问题定位
你编写的语句返回全量记录,核心是四个逻辑错误导致过滤、关联完全失效:
- 关联条件存在无效恒等式:
wh1.part_code = wh1.part_code永远为真,没有将wh1的part_code和wh2做匹配,JOIN过程无法过滤不匹配的行 - 子查询聚合维度错误:把
wo_numb、run_number、run_date全部加入GROUP BY分组维度,此时MAX(run_date)计算的结果就是每行自身的run_date,根本没有实现“按part_code维度取最大日期”的聚合目标 - 日期过滤写法错误:
wh1.run_date > 1 / 1 / 20在多数SQL引擎中会被解析为数学除法运算(计算结果为0.05),而非2020年1月1日的日期值,导致日期过滤完全失效 - 过滤时机不合理:所有业务过滤条件放在外层JOIN完成后才执行,既放大了中间计算的数据量,也容易因为关联逻辑错误漏过滤不符合要求的行
修正后的实现方案
方案1:窗口函数实现(推荐,逻辑清晰易维护)
SELECT part_code, run_date, wo_numb, run_number, cost_ctr, wo_status FROM ( SELECT wh.part_code, wh.run_date, wh.wo_numb, wh.run_number, wh.cost_ctr, wh.wo_status, ROW_NUMBER() OVER ( PARTITION BY wh.part_code ORDER BY wh.run_date DESC ) AS record_rank FROM wohead wh WHERE wh.cost_ctr = '20' AND wh.wo_status = 'C' AND wh.part_code IN ('7DADP0312PL03', '7DADP0178PL03') AND wh.run_date > '2020-01-01' ) filter_result WHERE record_rank = 1 ORDER BY part_code
方案2:聚合关联实现(适配不支持窗口函数的老旧数据库)
SELECT wh1.part_code, wh1.run_date, wh1.wo_numb, wh1.run_number, wh1.cost_ctr, wh1.wo_status FROM wohead wh1 INNER JOIN ( SELECT part_code, MAX(run_date) AS max_valid_run_date FROM wohead WHERE cost_ctr = '20' AND wo_status = 'C' AND part_code IN ('7DADP0312PL03', '7DADP0178PL03') AND run_date > '2020-01-01' GROUP BY part_code ) wh2 ON wh1.part_code = wh2.part_code AND wh1.run_date = wh2.max_valid_run_date AND wh1.cost_ctr = '20' AND wh1.wo_status = 'C' ORDER BY wh1.part_code
上述SQL执行后将完全匹配你预期的查询结果:
- 对
7DADP0178PL03,符合基础过滤条件的记录仅1条(12/29/2020 成本中心20、状态C),即为该物料下最新的有效工单- 对
7DADP0312PL03,2019年的记录因日期早于2020-01-01被过滤,剩余符合条件的记录中2/16/2021的工单为日期最新的有效记录
内容的提问来源于stack exchange,提问作者Char
相关产品推荐
相关产品推荐

