如何用SQL查询酒驾司机占比高于均值20个百分点的州?
你的SQL查询分析与优化建议
你的查询逻辑是完全可行的,它等价于筛选出percent_alcohol_impaired大于所有州平均酒驾占比+20个百分点的记录,通过数学移项后逻辑完全成立,能够得到你需要的结果。
更优的查询方式
当表数据量较大时,你的原查询会对playground.bad_drivers表进行两次扫描(一次子查询计算平均值,一次主查询筛选数据)。可以使用窗口函数AVG() OVER()减少一次表扫描,提升查询效率:
SELECT state, percent_alcohol_impaired FROM ( SELECT state, percent_alcohol_impaired, AVG(percent_alcohol_impaired) OVER() AS avg_alcohol_impaired FROM playground.bad_drivers ) AS sub WHERE percent_alcohol_impaired > avg_alcohol_impaired + 20 LIMIT 100;
如果追求代码可读性,也可以用CTE(公共表表达式)改写,逻辑和上面的子查询完全一致:
WITH driver_stats AS ( SELECT state, percent_alcohol_impaired, AVG(percent_alcohol_impaired) OVER() AS avg_alcohol_impaired FROM playground.bad_drivers ) SELECT state, percent_alcohol_impaired FROM driver_stats WHERE percent_alcohol_impaired > avg_alcohol_impaired + 20 LIMIT 100;
总结
你的原查询逻辑正确,能够得到预期结果;窗口函数/CTE版本只需要扫描一次表,在大数据量场景下性能更优,同时代码结构也更清晰。
内容的提问来源于stack exchange,提问作者dz1981-bit
相关产品推荐
相关产品推荐

