Netezza SQL中按车辆数量区间计算各国患病占比的逻辑验证
验证Netezza SQL逻辑的步骤
一、车辆数量区间划分的验证
1. 检查边界值归属逻辑
首先确认你的区间划分是否符合需求定义,重点关注5、10、15这类边界值的归属:
- 若需求是
0-5包含5、5-10包含10,需避免重复匹配(Netezza的CASE会取第一个满足条件的分支),推荐用左闭右开的写法:
CASE WHEN 车辆数量 >= 0 AND 车辆数量 <= 5 THEN '0-5' WHEN 车辆数量 > 5 AND 车辆数量 <= 10 THEN '5-10' WHEN 车辆数量 > 10 AND 车辆数量 <= 15 THEN '10-15' WHEN 车辆数量 > 15 THEN '15以上' ELSE '未知' -- 处理NULL、负数等异常值 END AS 车辆数量区间
2. 统计区间极值验证
通过分组查询每个区间的最小/最大车辆数,确认划分是否符合预期:
SELECT 车辆数量区间, MIN(车辆数量) AS 区间最小车辆数, MAX(车辆数量) AS 区间最大车辆数, COUNT(*) AS 区间人数 FROM ( SELECT *, CASE WHEN 车辆数量 >= 0 AND 车辆数量 <= 5 THEN '0-5' WHEN 车辆数量 > 5 AND 车辆数量 <= 10 THEN '5-10' WHEN 车辆数量 > 10 AND 车辆数量 <= 15 THEN '10-15' WHEN 车辆数量 > 15 THEN '15以上' ELSE '未知' END AS 车辆数量区间 FROM my_table ) t GROUP BY 车辆数量区间 ORDER BY 车辆数量区间;
查看结果:比如0-5区间的最大值应≤5,5-10区间的最小值应>5且最大值≤10,确保无边界值错配。
二、患病占比计算的验证
1. 确认占比公式正确性
患病占比应为**(区间内该国患病人数 ÷ 区间内该国总人数)×100%**,需注意:
- Netezza整数除法会截断小数,必须用
100.0强制转换为浮点运算 - 处理分母为0的情况(若某区间某国无数据,可加
NULLIF避免报错)
示例正确写法:
SELECT 年份, 所属国家, 车辆数量区间, COUNT(CASE WHEN 是否患病 = '是' THEN 1 END) AS 患病人数, COUNT(*) AS 总人数, ROUND( COUNT(CASE WHEN 是否患病 = '是' THEN 1 END) * 100.0 / NULLIF(COUNT(*), 0), 2 ) AS 患病占比 FROM ( SELECT *, CASE WHEN 车辆数量 >= 0 AND 车辆数量 <= 5 THEN '0-5' WHEN 车辆数量 > 5 AND 车辆数量 <= 10 THEN '5-10' WHEN 车辆数量 > 10 AND 车辆数量 <= 15 THEN '10-15' WHEN 车辆数量 > 15 THEN '15以上' ELSE '未知' END AS 车辆数量区间 FROM my_table WHERE 是否患病 IS NOT NULL -- 排除未明确患病状态的记录(按需调整) ) t GROUP BY 年份, 所属国家, 车辆数量区间 ORDER BY 年份, 所属国家, 车辆数量区间;
2. 手动抽样验证
- 随机选取3-5组年份+国家+区间的组合,手动统计原表中对应分组的总人数和患病人数,计算占比后与SQL结果对比
- 检查全局汇总:所有区间的患病人数总和应等于原表中
是否患病='是'的总记录数,总人数总和应等于原表有效记录数(排除未知区间后)
内容的提问来源于stack exchange,提问作者stats_noob
相关产品推荐
相关产品推荐

