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

求助:完善订单过滤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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 04:09:56