You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL查询需求:筛选最后一条日志状态为Prepared的订单

筛选最后一条日志状态为Prepared的订单

嘿,这个需求其实挺典型的——我们要找出那些最新日志状态是Prepared的订单,也就是每个订单的最后一条(最大LOG NUMBER对应的)日志必须是Prepared。先看你的示例数据,订单2的最后日志是Prepared(LOG NUMBER=1),订单4的最后日志也是Prepared(LOG NUMBER=2),这俩就是我们要的结果。

下面给你两种常用的实现方式,你可以根据自己使用的数据库(比如MySQL、PostgreSQL、SQL Server都支持)选合适的:

方法一:子查询关联法

这种方法先找出每个订单的最新日志编号,再关联原表筛选对应状态:

SELECT t.`ORDER`
FROM your_table t
INNER JOIN (
    -- 先拿到每个订单的最大日志编号(也就是最后一条日志)
    SELECT `ORDER`, MAX(`LOG NUMBER`) AS latest_log_num
    FROM your_table
    GROUP BY `ORDER`
) latest ON t.`ORDER` = latest.`ORDER` AND t.`LOG NUMBER` = latest.latest_log_num
WHERE t.`LOG CODE` = 'Prepared';

方法二:窗口函数法(更简洁)

用窗口函数给每个订单的日志按编号倒序排,标记出最新的那条,再筛选状态:

WITH order_log_ranked AS (
    SELECT 
        `ORDER`,
        `LOG CODE`,
        -- 按订单分组,日志编号倒序,最新的日志标记为1
        ROW_NUMBER() OVER (PARTITION BY `ORDER` ORDER BY `LOG NUMBER` DESC) AS log_rank
    FROM your_table
)
SELECT `ORDER`
FROM order_log_ranked
WHERE log_rank = 1 AND `LOG CODE` = 'Prepared';

小提示

如果你的业务里存在同一订单同一LOG NUMBER有多条日志的情况(比如并发写入导致编号重复),可以把ROW_NUMBER()换成RANK()或者DENSE_RANK(),这样能处理并列的最新日志。不过从你的示例数据来看,LOG NUMBER是每个订单严格递增的,所以用ROW_NUMBER()完全没问题。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:10:02