技术问询:如何在从源表向目标表插入数据时,将SaleTo字段设为对应SaleNo下最大SaleSequence的SaleFrom值
解决SaleTo字段取值问题:获取对应SaleNo下最大序列的SaleFrom
我明白你的需求啦——要给目标表的每条记录添加上SaleTo字段,这个字段的值是当前SaleNo下SaleSequence最大的那条记录的SaleFrom值。咱们来一步步修正你的思路,给出可行的SQL方案。
问题分析
你原来的SQL逻辑有点偏差:GROUP BY a.SaleNo, b.SaleFrom会把每个SaleNo和SaleFrom的组合单独分组,这样MAX(a.SaleSequence)取的是每个小分组的最大值,而不是整个SaleNo下的全局最大值,自然得不到想要的结果。
方案一:用窗口函数(简洁高效)
窗口函数是处理这类分组取最值关联的绝佳工具,代码清晰且性能不错:
SELECT SaleNo, SaleFrom, SaleSequence, -- 取当前SaleNo下,序列最大的那条记录的SaleFrom作为SaleTo MAX(CASE WHEN rn = 1 THEN SaleFrom END) OVER (PARTITION BY SaleNo) AS SaleTo FROM ( -- 给每个SaleNo的记录按SaleSequence倒序编号,最大的那条rn=1 SELECT *, ROW_NUMBER() OVER (PARTITION BY SaleNo ORDER BY SaleSequence DESC) AS rn FROM SequenceOrderSource ) sub
方案二:子查询关联(兼容旧版本SQL)
如果你的数据库不支持窗口函数(比如某些老版本MySQL),可以用子查询先找出每个SaleNo对应的目标SaleFrom,再关联回去:
SELECT s.SaleNo, s.SaleFrom, s.SaleSequence, t.SaleTo FROM SequenceOrderSource s -- 关联子查询,子查询拿到每个SaleNo下最大序列的SaleFrom JOIN ( SELECT SaleNo, SaleFrom AS SaleTo FROM SequenceOrderSource WHERE (SaleNo, SaleSequence) IN ( SELECT SaleNo, MAX(SaleSequence) FROM SequenceOrderSource GROUP BY SaleNo ) ) t ON s.SaleNo = t.SaleNo
这两种方案都能得到你想要的目标表结果,你可以根据自己的数据库环境选择合适的写法~
内容的提问来源于stack exchange,提问作者sqlenthusiast
相关产品推荐
相关产品推荐

