如何验证两次SQL查询的正确性?含就诊次数与间隔分析场景
验证两次SQL查询正确性的方法
一、你提到的首行患者数校验逻辑完全合理
第一个查询的num_people总和是5+3+2+1+1=12,对应数据库里的总患者数;第二个查询首行current_visit=NA的分组,统计的是所有患者的「首次就诊阶段」(没有前序就诊记录),患者数必然等于总患者数,这是验证两次查询数据一致性的核心基础校验点。
二、第一次查询的验证步骤
第一次查询是「按患者分组统计就诊次数,再按就诊次数分组统计对应患者数」,可以从这几个维度验证:
- 核对总就诊记录数:计算
num_visits * num_people的总和:1×5 + 2×3 + 3×2 + 4×1 + 5×1 = 26,这个数必须和hospital_visits表的总记录数一致,直接用SELECT COUNT(*) FROM hospital_visits;就能验证。 - 核对总患者数:第一个查询的
num_people总和是12,要等于SELECT COUNT(DISTINCT patient_id) FROM hospital_visits;的结果,确保没有重复统计患者。 - 抽样验证:随机挑几个不同就诊次数的患者,比如找1个就诊5次的患者,手动数他在表中的记录数是不是5;找3个就诊2次的患者,确认每个的记录数都是2,验证分组统计的准确性。
三、第二次查询的验证步骤
第二次查询是「分析患者连续就诊间隔,按就诊阶段分组统计患者数与平均间隔」,验证逻辑如下:
- 各阶段患者数的逻辑匹配:
- 阶段
(1,2)的患者数是7,对应第一个查询中「就诊次数≥2」的患者数:3+2+1+1=7,必须完全匹配——只有就诊至少2次的患者,才会有第1到第2次的就诊间隔。 - 阶段
(2,3)的患者数是4,对应「就诊次数≥3」的患者数:2+1+1=4,匹配。 - 阶段
(3,4)的患者数是2,对应「就诊次数≥4」的患者数:1+1=2,匹配。 - 阶段
(4,5)的患者数是1,对应「就诊次数=5」的患者数:1,匹配。
这些对应关系是判断第二次查询分组逻辑正确的关键。
- 阶段
- 平均间隔天数的验证:
- 随机选某个阶段的患者,比如阶段
(1,2)的7个患者,手动计算每个患者第一次和第二次就诊的间隔天数,再求平均值,看是否接近59.4。 - 检查是否存在间隔天数为负数的异常数据(比如就诊日期顺序写反),如果有,说明标记就诊顺序的窗口函数逻辑可能出错(比如应该用
ROW_NUMBER() OVER(PARTITION BY patient_id ORDER BY visit_date)来排序就诊记录)。
- 随机选某个阶段的患者,比如阶段
- 空值逻辑验证:
current_visit=NA的分组只有next_visit=1,且没有平均间隔,符合首次就诊没有前序记录的逻辑;最后一个阶段(4,5)没有后续阶段,对应就诊次数最多为5次的结果,逻辑自洽。
四、交叉验证的补充思路
- 用第一个查询的结果推导第二个查询各阶段的理论患者数,再和实际结果对比(就是上面的各阶段对应关系),如果完全匹配,说明两次查询的患者分组逻辑一致。
- 统计第二个查询中所有
num_people的总和:12+7+4+2+1=26,这个数要等于总就诊记录数——因为每个就诊记录对应一个阶段(首次就诊对应NA→1,后续每次就诊对应前一次到当前的阶段),这也是一个有效的校验方式。
内容的提问来源于stack exchange,提问作者farrow90
相关产品推荐
相关产品推荐

