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

如何筛选最新运输状态为OK的订单?SQL查询修正需求

解决筛选最新运输记录状态为'OK'的订单问题

你的原SQL语句核心问题是没有按单个订单维度去获取最新运输记录,而是全局查询了所有状态为'OK'的运输记录里的最大日期,这会导致你拿到的是所有在这个日期的运输记录,完全忽略了每个订单自身的最新运输状态。

针对你的需求,这里提供两种常用的解决方案:

方法一:使用窗口函数(推荐,逻辑清晰)

利用ROW_NUMBER()窗口函数,按订单分组后给每条运输记录按日期倒序编号,编号为1的就是该订单的最新运输记录,再筛选这条记录的状态为'OK'即可:

SELECT ord.id AS order_id, tr.id AS transportation_id, tr.date, tr.status
FROM orders ord
JOIN (
    SELECT 
        order_id,
        id,
        date,
        status,
        -- 按订单分组,每组内按日期倒序排序,最新的记录编号为1
        ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY date DESC) AS rn
    FROM transportation
) tr ON ord.id = tr.order_id
WHERE tr.rn = 1 AND tr.status = 'ok';

方法二:子查询获取每个订单的最新日期

先通过子查询得到每个订单的最新运输日期,再关联运输表找到对应日期的记录,最后筛选状态为'OK'的订单:

SELECT ord.id AS order_id, tr.id AS transportation_id, tr.date, tr.status
FROM orders ord
JOIN transportation tr ON ord.id = tr.order_id
-- 子查询得到每个订单的最新运输日期
JOIN (
    SELECT order_id, MAX(date) AS latest_date
    FROM transportation
    GROUP BY order_id
) latest_tr ON tr.order_id = latest_tr.order_id AND tr.date = latest_tr.latest_date
WHERE tr.status = 'ok';

验证示例数据

针对你提供的示例数据:

order_id, transportation_id, date, status
001, 001, 01/01/19, ok
001, 002, 01/01/20, ca
002, 003, 01/01/19, ca
002, 004, 01/01/18, ok
003, 005, 01/01/17, ok
003, 006, 01/01/16, ca

这两种方法都会准确筛选出003, 005, 01/01/17, ok这条符合要求的记录——因为订单003的最新运输记录状态确实是'OK',而其他订单的最新记录状态都不是'OK'。

内容的提问来源于stack exchange,提问作者User1

火山引擎 最新活动