SQL多条件筛选行:排除最新状态为Y的N状态记录
解决方案
针对百万级数据量的场景,推荐以下两种高效的实现方式,同时建议给order_id和date字段建立复合索引以提升查询性能:
方法一:使用窗口函数(性能最优)
通过窗口函数先获取每个订单的最新状态,再关联原表筛选符合条件的记录:
WITH latest_order_status AS ( SELECT order_id, status, ROW_NUMBER() OVER (PARTITION BY order_id ORDER BY date DESC) AS rn FROM your_table_name ) SELECT t.* FROM your_table_name t JOIN latest_order_status los ON t.order_id = los.order_id WHERE t.status = 'N' AND los.rn = 1 AND los.status != 'Y';
方法二:使用EXISTS子查询
直接对每条状态为N的记录,检查其对应订单的最新状态是否为Y,若不为Y则保留:
SELECT t.* FROM your_table_name t WHERE t.status = 'N' AND NOT EXISTS ( SELECT 1 FROM your_table_name t2 WHERE t2.order_id = t.order_id AND t2.date = (SELECT MAX(date) FROM your_table_name WHERE order_id = t.order_id) AND t2.status = 'Y' );
性能优化建议
创建复合索引加速查询:
CREATE INDEX idx_order_date ON your_table_name(order_id, date DESC);
内容的提问来源于stack exchange,提问作者R.K
相关产品推荐
相关产品推荐

