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
相关产品推荐
相关产品推荐

