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

优化同customer_id与submitted_by的SQL查询及状态筛选需求

解决方案

优化后的SQL查询

下面的查询同时满足你的两个需求,并且对原语句做了性能和可读性优化:

WITH grouped_defaulters AS (
    SELECT 
        *,
        -- 给每个(customer_id, submitted_by)分组按创建时间排序打行号
        ROW_NUMBER() OVER(PARTITION BY customer_id, submitted_by ORDER BY date_created ASC) AS row_num,
        -- 直接计算每个分组的总记录数,避免重复子查询
        COUNT(id) OVER(PARTITION BY customer_id, submitted_by) AS group_total
    FROM defaulters
)
SELECT *
FROM grouped_defaulters
WHERE 
    -- 只保留重复的分组(记录数>1)
    group_total > 1
    -- 确保当前分组的首行记录状态不是'rejected'
    AND EXISTS (
        SELECT 1
        FROM grouped_defaulters g
        WHERE g.customer_id = grouped_defaulters.customer_id
          AND g.submitted_by = grouped_defaulters.submitted_by
          AND g.row_num = 1
          AND g.defaulters_status != 'rejected'
    )
LIMIT 10;

关键优化点说明

  1. 消除重复子查询:原查询两次重复执行相同的分组统计子查询,优化后用COUNT() OVER()窗口函数一次性计算每个分组的记录数,减少对defaulters表的扫描次数,提升性能。
  2. 简化逻辑嵌套:用CTE(公共表表达式)拆分查询逻辑,让代码结构更清晰,便于后续维护和修改。
  3. 高效的条件判断:用EXISTS替代原有的两个IN子查询,EXISTS在找到匹配记录后会立即停止检索,比IN更高效,尤其是在数据量较大的场景下。

需求1的实现说明

通过EXISTS子查询检查每个(customer_id, submitted_by)分组的首行(row_num=1)记录,确保其defaulters_status不等于'rejected',只有满足这个条件的分组才会被纳入最终结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 19:10:32