SQL查询最新发票及关联调整明细仅返回单条问题解决
问题根因
原SQL的问题出在ROW_NUMBER()窗口函数的作用范围不对:三表完成关联后,同一个最新发票如果对应多条调整记录、多条费用编码(Charge_code)记录,这些明细行都会被划入同一个Shipment_Nbr分区,最终=1的过滤条件只会保留分区内排序第1的单条明细,自然无法返回全部关联的调整、费用数据。
修正方案
核心调整思路是先单独在发票表维度筛选出每个运单号对应的最新发票主记录,再用筛选后的结果关联调整表、费用表,避免明细行干扰窗口函数的排序筛选逻辑,最终就能保留最新发票下的所有关联明细。
修正后的SQL如下:
WITH latest_invoice AS ( SELECT Invoice, Shipment_Nbr, Invoice_date FROM Invoicing -- 仅在发票表层做去重,每个运单号保留最新日期的发票 QUALIFY ROW_NUMBER() OVER ( PARTITION BY Shipment_Nbr ORDER BY Invoice_date DESC -- 若同运单号同发票日期存在重复发票,可补充发票唯一ID作为次级排序,保证结果稳定 -- , invoice_uniq_id DESC ) = 1 ) SELECT a.Invoice, a.Shipment_Nbr, a.Invoice_date, b.Adjust_rsn, b.Adjust_date, c.Charge_code, c.Charge_Amt FROM latest_invoice a INNER JOIN Adjust b ON a.Shipment_Nbr = b.Shipment_Nbr INNER JOIN Charge c ON b.uniq_id = c.uniq_id WHERE b.Adjust_date BETWEEN '2022-05-01' AND '2022-05-31'
注意事项
- 如果你的数据库不支持CTE语法,也可以把CTE部分替换为子查询放在FROM后,逻辑完全一致。
- 日期条件建议统一使用
YYYY-MM-DD的标准格式,避免不同数据库的日期解析规则差异导致筛选结果错误。
内容的提问来源于stack exchange,提问作者Stephen Peck
相关产品推荐
相关产品推荐

