优化同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;
关键优化点说明
- 消除重复子查询:原查询两次重复执行相同的分组统计子查询,优化后用
COUNT() OVER()窗口函数一次性计算每个分组的记录数,减少对defaulters表的扫描次数,提升性能。 - 简化逻辑嵌套:用CTE(公共表表达式)拆分查询逻辑,让代码结构更清晰,便于后续维护和修改。
- 高效的条件判断:用
EXISTS替代原有的两个IN子查询,EXISTS在找到匹配记录后会立即停止检索,比IN更高效,尤其是在数据量较大的场景下。
需求1的实现说明
通过EXISTS子查询检查每个(customer_id, submitted_by)分组的首行(row_num=1)记录,确保其defaulters_status不等于'rejected',只有满足这个条件的分组才会被纳入最终结果。
内容的提问来源于stack exchange,提问作者Mukesh Majoka
相关产品推荐
相关产品推荐

