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

PostgreSQL技术问询:获取使用指定优惠码(ABC123)后的所有后续订单ID

解决方案:获取使用特定优惠码后的所有后续订单

要实现你的需求,我们需要先定位每个账户第一次使用ABC123优惠码的订单节点,然后筛选出该账户在这个节点之后的所有订单(包括该优惠码订单本身)。假设你的order_id是按订单创建时间递增的(如果有专门的下单时间字段,比如order_date,可以替换成时间字段来更精准判断),可以用以下SQL语句实现:

WITH promo_users AS (
    -- 第一步:获取每个使用过ABC123的账户,以及他们第一次使用该优惠码的订单ID
    SELECT account_id, MIN(order_id) AS first_promo_order_id
    FROM orders
    WHERE promo_code = 'ABC123'
    GROUP BY account_id
)
-- 第二步:关联原订单表,筛选出每个账户在第一次使用优惠码之后的所有订单
SELECT o.account_id, o.order_id, o.promo_code
FROM orders o
JOIN promo_users pu ON o.account_id = pu.account_id
WHERE o.order_id >= pu.first_promo_order_id
ORDER BY o.account_id, o.order_id;

代码解释

  1. CTE promo_users:通过分组查询,为每个使用过ABC123的账户计算出他们第一次使用该优惠码的订单ID(用MIN(order_id)取最早的那笔)。
  2. 关联筛选:将原订单表和promo_users关联,只保留每个账户中订单ID大于等于第一次使用优惠码的订单ID的记录,这样就自动排除了使用优惠码之前的订单。
  3. 排序:最后按account_id和order_id排序,得到你期望的结果。

针对你的示例数据验证

运行上述SQL后,会得到完全符合你预期的结果:

Account_idorder_idpromo_code
1126ABC123
2124ABC123
2125NULL
2127HelloWorld!
3128ABC123

如果你的订单表有专门的下单时间字段(比如order_created_at),建议把MIN(order_id)替换为MIN(order_created_at),并将WHERE条件改为o.order_created_at >= pu.first_promo_time,这样判断订单先后顺序会更准确。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 07:23:11