SQL查询如何获取各item每月最大due_date对应的net_avail_qty记录
你的需求本质是按item+到期日所在月份分组后,取每个分组内到期日最大的整行数据。你之前的写法只能取到分组后的最大到期日,无法直接关联对应net_avail_qty的原因是:net_avail_qty不在GROUP BY的分组维度中,也没有被聚合函数包裹,直接添加会导致同分组下所有不同net_avail_qty的行全部返回。
推荐使用Oracle支持的窗口函数实现,写法简洁且性能更优:
SELECT item, due_date, net_avail_qty FROM ( SELECT item, due_date, net_avail_qty, -- 按item和月份分组,组内按到期日倒序排序 ROW_NUMBER() OVER ( PARTITION BY item, TRUNC(due_date, 'MM') ORDER BY due_date DESC ) AS rn FROM 你的实际表名 ) t WHERE rn = 1 -- 取每个分组内到期日最大的1条记录 ORDER BY item, due_date;
如果是不支持窗口函数的老版本Oracle,也可以用关联子查询实现:
SELECT a.item, a.due_date, a.net_avail_qty FROM 你的实际表名 a WHERE a.due_date = ( SELECT MAX(b.due_date) FROM 你的实际表名 b WHERE b.item = a.item AND TRUNC(b.due_date, 'MM') = TRUNC(a.due_date, 'MM') ) ORDER BY a.item, a.due_date;
以上两种写法返回的结果和你需要的最终输出完全匹配。
内容的提问来源于stack exchange,提问作者MMITSCH
相关产品推荐
相关产品推荐

