如何用SQL查询特定年龄猜测值出现次数最少的人员记录
解决方法:获取被猜测为特定值次数最少的人员记录
核心思路
先统计所有人员被猜为目标值的次数(包含从未被猜测的0次),再筛选出次数等于最小值的记录。
完整SQL(以MySQL为例,其他数据库逻辑通用)
WITH NameGuessCounts AS ( SELECT t.Name, COUNT(CASE WHEN t.AgeGuess = 36 THEN 1 END) AS GuessedToBe36Count FROM your_table_name t GROUP BY t.Name ) SELECT Name, GuessedToBe36Count FROM NameGuessCounts WHERE GuessedToBe36Count = (SELECT MIN(GuessedToBe36Count) FROM NameGuessCounts);
代码解释
统计次数的CTE(NameGuessCounts)
- 通过
GROUP BY Name自动实现姓名去重,确保每个姓名单独分组。 - 用
COUNT(CASE WHEN AgeGuess = 36 THEN 1 END)计算次数:符合条件的记录计数1,不符合的返回NULL,而COUNT会忽略NULL,因此从未被猜为36的人员次数会自动显示为0。
- 通过
筛选最小次数的记录
- 子查询
(SELECT MIN(GuessedToBe36Count) FROM NameGuessCounts)获取所有人员中的最小猜测次数。 - 主查询筛选出次数等于该最小值的记录,即可得到所有次数最少的人员。
- 子查询
兼容老版本数据库的写法(无CTE)
如果你的数据库不支持CTE(比如MySQL 5.x版本),可以用嵌套子查询实现:
SELECT Name, GuessedToBe36Count FROM ( SELECT t.Name, COUNT(CASE WHEN t.AgeGuess = 36 THEN 1 END) AS GuessedToBe36Count FROM your_table_name t GROUP BY t.Name ) AS temp WHERE GuessedToBe36Count = (SELECT MIN(GuessedToBe36Count) FROM ( SELECT t.Name, COUNT(CASE WHEN t.AgeGuess = 36 THEN 1 END) AS GuessedToBe36Count FROM your_table_name t GROUP BY t.Name ) AS temp2);
注意事项
- 替换
your_table_name为你实际使用的表名。 - 若要查询其他目标猜测值,只需把SQL中的
36替换成对应的数值即可。
内容的提问来源于stack exchange,提问作者Math Noob
相关产品推荐
相关产品推荐

