求助:完善订单过滤SQL逻辑,实现旧订单跳过规则
完善订单过滤SQL逻辑以满足所有业务规则
你的现有SQL已经处理了跳过重复订单和跳过已取消订单的规则,但缺少处理跳过被后续订单关联的旧订单的逻辑。要实现这一点,我们需要先识别出所有被其他订单引用为previous_order_id的订单,再将这些旧订单从结果中排除。
以下是完善后的完整SQL:
WITH cte_deduplicated AS ( SELECT * , row_number() OVER (PARTITION BY customer_id, order_id, item_id ORDER BY order_date DESC) AS duplicates FROM customer_orders WHERE order_status = 'completed' -- 先过滤取消订单,减少后续计算量 ), cte_old_orders AS ( -- 收集所有被作为previous_order_id的订单ID,这些是需要跳过的旧订单 SELECT DISTINCT previous_order_id AS old_order_id FROM customer_orders WHERE previous_order_id IS NOT NULL ) SELECT d.* FROM cte_deduplicated d LEFT JOIN cte_old_orders o ON d.order_id = o.old_order_id WHERE d.duplicates = 1 AND o.old_order_id IS NULL -- 排除被后续订单关联的旧订单 ORDER BY d.id, d.order_date, d.customer_id, d.order_id;
逻辑说明:
cte_deduplicated:先过滤掉已取消的订单,再通过row_number()对同一客户、同一订单ID、同一商品的重复订单进行分组,保留每组中最新的订单(duplicates=1)。cte_old_orders:提取所有被其他订单引用的previous_order_id,这些ID对应的订单就是需要跳过的旧订单。- 最终查询:将去重后的订单与旧订单集合左连接,排除掉那些属于旧订单的记录,得到符合所有规则的结果。
验证结果:
执行后将返回以下3条记录:
- id=1(无重复、已完成、无后续关联订单)
- id=3或4(重复订单中保留的一条,已完成、无后续关联订单)
- id=6(无重复、已完成、关联了旧订单id=5,本身不是旧订单)
内容的提问来源于stack exchange,提问作者BeginnerDeveloper
相关产品推荐
相关产品推荐

