如何在SQL中从子查询取最大值,统计SibSp≥1的男女乘客数取最大值
SQL查询优化方案
原代码问题
你现有的SQL存在逻辑错误:WHERE子句的作用是过滤行记录,不能直接接收返回多列多行的统计子查询作为过滤条件。你需要先将统计子查询的结果作为临时表(派生表/CTE),再基于临时表筛选最大值记录。
方案1:仅取单条最大值记录(无并列场景适用)
写法最简单,执行效率最高,直接在原有统计逻辑基础上调整即可:
SELECT Sex, total_passengers FROM ( SELECT Sex, COUNT(PassengerId) AS total_passengers FROM passenger WHERE SibSp >= 1 -- 此处SibSp>0和需求的SibSp≥1逻辑等价,可根据实际需要调整 GROUP BY Sex ) AS gender_cnt ORDER BY total_passengers DESC LIMIT 1;
方案2:兼容并列最大值场景
如果存在男女乘客数量相等、同为最大值的情况,用窗口函数写法可以返回所有符合最大值的记录:
WITH gender_cnt AS ( SELECT Sex, COUNT(PassengerId) AS total_passengers FROM passenger WHERE SibSp >= 1 GROUP BY Sex ), ranked_cnt AS ( SELECT Sex, total_passengers, RANK() OVER (ORDER BY total_passengers DESC) AS cnt_rank FROM gender_cnt ) SELECT Sex, total_passengers FROM ranked_cnt WHERE cnt_rank = 1;
内容的提问来源于stack exchange,提问作者coder_bg
相关产品推荐
相关产品推荐

