You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动