如何在SQL查询中排除出现次数少于3次的城市数据行?
问题描述
现有一张名为cities的表,数据如下:
| ID | city |
|---|---|
| 1 | paris |
| 2 | paris |
| 3 | london |
| 4 | london |
| 5 | london |
| 6 | london |
需要查询排除所有出现次数少于3次的城市对应的行(即移除paris相关的记录),预期结果如下:
| ID | city |
|---|---|
| 3 | london |
| 4 | london |
| 5 | london |
| 6 | london |
解决方案
这里提供两种常用的实现方式:
方法一:子查询+关联筛选
先统计每个城市的出现次数,筛选出符合条件的城市,再关联原表获取对应行:
SELECT c.ID, c.city FROM cities c JOIN ( SELECT city FROM cities GROUP BY city HAVING COUNT(*) >= 3 ) city_counts ON c.city = city_counts.city;
方法二:窗口函数(适用于支持窗口函数的数据库)
通过窗口函数直接计算每个城市的总出现次数,再筛选符合条件的行:
SELECT ID, city FROM ( SELECT ID, city, COUNT(*) OVER (PARTITION BY city) AS city_total FROM cities ) filtered_cities WHERE city_total >= 3;
这种方法不需要额外的关联操作,在支持窗口函数的数据库(比如MySQL 8.0+、PostgreSQL、SQL Server等)中使用更简洁。
内容的提问来源于stack exchange,提问作者DragonToes
相关产品推荐
相关产品推荐

