SQL统计近91天急救服务索赔数时子查询返回全量数据的解决方法
SQL修正方案
问题原因
原统计就诊次数的子查询未添加与外层一致的急救编码、日期范围筛选条件,会扫描全量历史索赔记录做计数,既不符合统计范围要求,也会产生不必要的性能开销。
修改要点
- 子查询内同步添加与外层完全一致的筛选规则,仅统计近91天内的急救服务索赔记录,避免拉取客户全量历史数据
- 子查询内通过
HAVING子句提前过滤就诊次数不足3次的客户,减少后续关联计算的数据量,利用「符合条件的记录单客户最多10条」的特性大幅提升查询效率 - 关联后直接引用子查询预计算的
VisitCount字段做排序,无需在外层重复分组计数
修正后的完整SQL(保留单条就诊明细场景)
SELECT UMI, PIN, main.Agreement, sq.VisitCount, med.Code, Date FROM main INNER JOIN ( SELECT Agreement, COUNT(*) as VisitCount FROM main WHERE med.Code BETWEEN '99281' AND '99285' AND Date >= (CURRENT_DATE - 91) GROUP BY Agreement HAVING COUNT(*) >= 3 ) AS sq ON main.Agreement = sq.Agreement -- 此处保留你原本验证可用的其他内连接逻辑 --Inner Joins that work are excluded WHERE med.Code BETWEEN '99281' AND '99285' AND Date >= (CURRENT_DATE - 91) ORDER BY sq.VisitCount DESC;
简化版本(仅需聚合统计就诊次数场景)
如果你不需要展示单条索赔明细,只需要输出近91天急救就诊≥3次的客户ID和对应就诊次数,可以去掉子查询关联,直接单表聚合,性能更高:
SELECT Agreement, COUNT(*) as VisitCount FROM main WHERE med.Code BETWEEN '99281' AND '99285' AND Date >= (CURRENT_DATE - 91) GROUP BY Agreement HAVING COUNT(*) >= 3 ORDER BY VisitCount DESC;
内容的提问来源于stack exchange,提问作者MagPai
相关产品推荐
相关产品推荐

