获取出现次数最少的邮政编码及对应计数的SQL查询问题
解决住房数据中获取出现次数最少的邮政编码及计数值的问题
我完全懂你的困扰——想找出住房数据里出现次数最少的所有邮政编码,以及它们统一的计数值,但之前的查询只拿到了最小次数,没把对应的邮编都关联出来对吧?这确实是因为单纯用GROUP BY搭配MIN()的话,没法捕获所有并列最小次数的邮编记录。下面给你两种实用的解决方法,适配不同的数据库场景:
方法1:嵌套子查询筛选
先通过内层子查询算出每个邮政编码的出现次数,再拿到这些次数里的最小值,最后筛选出计数等于这个最小值的邮编和对应次数:
SELECT zip_code, COUNT(*) AS occurrence_count FROM housing_data GROUP BY zip_code HAVING COUNT(*) = ( -- 先获取所有邮编的出现次数,再取其中的最小值 SELECT MIN(zip_count) FROM ( SELECT COUNT(*) AS zip_count FROM housing_data GROUP BY zip_code ) AS zip_count_subquery );
方法2:窗口函数(推荐,适合现代数据库)
如果你的数据库支持窗口函数(比如MySQL 8+、PostgreSQL、SQL Server等),用RANK()窗口函数会更简洁直观,它能直接给所有并列最小次数的邮编标记相同的排名:
-- 先用CTE计算每个邮编的次数和排名 WITH zip_occurrences AS ( SELECT zip_code, COUNT(*) AS occurrence_count, -- 按出现次数升序排名,次数最小的排名为1 RANK() OVER (ORDER BY COUNT(*) ASC) AS rank_num FROM housing_data GROUP BY zip_code ) -- 筛选出排名为1的记录,就是所有出现次数最少的邮编 SELECT zip_code, occurrence_count FROM zip_occurrences WHERE rank_num = 1;
如果你的数据库不支持CTE(公共表表达式),也可以把CTE部分改成子查询,效果完全一致。
注意事项
记得把代码里的housing_data替换成你的实际表名,zip_code替换成数据中存储邮政编码的字段名哦。
内容的提问来源于stack exchange,提问作者The Statistician Magician
相关产品推荐
相关产品推荐

