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

SQL查询近3个月无付款记录交易订单的正确写法

问题根源

原查询存在两个核心错误:

  1. 表名写错:业务实际使用的交易核算表为Transactions_accounting,原SQL查询的是transactions表,存在数据源错误风险
  2. 逻辑缺陷:仅筛选了account_datetime <= '2022-03-24'且状态为成功的记录,没有排除后续存在成功付款记录的订单。比如订单9809995虽然在2022-03-24之前有对应记录,但上个月存在成功付款的入账记录,因此被误包含在结果中。
正确查询语句

查询核心逻辑是:圈定近3个月的订单范围,排除掉所有存在成功付款记录的订单,最终返回符合要求的order_id。

SELECT DISTINCT t.order_id
FROM Transactions_accounting t
WHERE 
  -- 限定近3个月的时间范围,避免全表扫描
  t.account_datetime >= DATE_SUB(CURDATE(), INTERVAL 3 MONTH)
  -- 排除存在成功付款记录的订单
  AND NOT EXISTS (
      SELECT 1 
      FROM Transactions_accounting t2
      WHERE 
        t2.order_id = t.order_id
        AND t2.status = 'success'
        AND t2.account_datetime <= CURDATE()
  )

如果需要对齐你之前使用的固定查询基准日2022-03-24,只需要把SQL中所有CURDATE()替换为'2022-03-24'即可,此时返回结果不会包含上月已付款的9809995,完全匹配预期结果。

性能优化建议

针对10万量级的数据,做两点优化即可保证查询效率:

  • 给order_id、status、account_datetime三个字段建立联合索引,避免全表扫描
  • 优先使用NOT EXISTS写法做排除判断,相比NOT IN不会因为字段空值导致结果异常,性能也更稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 04:48:17