Oracle SQL中MAX() OVER PARTITION BY应用:查询零件最新收货记录
使用Oracle SQL查询特定零件的最新收货记录
没问题,我来帮你搞定这个需求!用MAX() OVER (PARTITION BY)窗口函数确实是获取分组内最新记录的好方法,结合筛选逻辑就能精准拿到你要的特定零件最新收货信息。
基础解决方案:获取每个零件的最新收货记录(含同日多条的情况)
假设你的表名为PURCHASE_RECEIPTS,我们可以先用CTE(公共表表达式)给每条记录标记对应零件的最新收货日期,再筛选出匹配的行:
WITH receipt_with_latest AS ( SELECT VEND_NUM, VEND_NAME, RECEIPT_NUM, RECEIPT_ITEM, RECEIPT_DATE, -- 按零件分组,计算该零件的最新收货日期 MAX(RECEIPT_DATE) OVER (PARTITION BY RECEIPT_ITEM) AS LATEST_RECEIPT_DATE FROM PURCHASE_RECEIPTS -- 指定你要查询的特定零件 WHERE RECEIPT_ITEM IN ('5844HAJ', '5521LRO', '8715JUI') ) SELECT VEND_NUM, VEND_NAME, RECEIPT_NUM, RECEIPT_ITEM, RECEIPT_DATE FROM receipt_with_latest -- 只保留收货日期等于该零件最新日期的记录 WHERE RECEIPT_DATE = LATEST_RECEIPT_DATE;
进阶处理:如果同一零件同日有多个收货记录,只取一条
如果某个零件在同一天有多条收货记录,上面的查询会返回所有这些记录。如果你想只保留其中一条(比如按收货单号最大的),可以改用ROW_NUMBER()窗口函数来排序:
WITH receipt_ranked AS ( SELECT VEND_NUM, VEND_NAME, RECEIPT_NUM, RECEIPT_ITEM, RECEIPT_DATE, -- 按零件分组,先按收货日期降序,再按收货单号降序排名 ROW_NUMBER() OVER (PARTITION BY RECEIPT_ITEM ORDER BY RECEIPT_DATE DESC, RECEIPT_NUM DESC) AS RECORD_RANK FROM PURCHASE_RECEIPTS WHERE RECEIPT_ITEM IN ('5844HAJ', '5521LRO', '8715JUI') ) SELECT VEND_NUM, VEND_NAME, RECEIPT_NUM, RECEIPT_ITEM, RECEIPT_DATE FROM receipt_ranked -- 只取排名第一的记录(即最新日期里的最大收货单号) WHERE RECORD_RANK = 1;
注意事项
- 记得把
PURCHASE_RECEIPTS替换成你实际使用的表名 - 如果你的
RECEIPT_DATE是字符串类型,需要先用TO_DATE(RECEIPT_DATE, 'MM/DD/YYYY')转换为日期类型再进行比较,避免格式错误 - 可以根据实际需求调整
WHERE子句里的零件列表,或者去掉该条件查询所有零件的最新记录
内容的提问来源于stack exchange,提问作者artemis




