如何筛选仅包含2017年记录的id数据?
问题描述
我有如下数据表:
| id | year | val |
|---|---|---|
| 1 | 2017 | 21 |
| 2 | 2017 | 22 |
| 1 | 2018 | 34 |
| 2 | 2018 | 55 |
| 1 | 2019 | 23 |
| 2 | 2019 | 43 |
| 3 | 2017 | 44 |
需要筛选出仅存在2017年记录的id,排除拥有其他年度记录的id,最终仅显示id=3的数据。
解决方案
可以通过以下几种SQL方式实现需求:
方法一:分组结合HAVING子句
通过分组统计每个id的年份范围,确保其最小和最大年份均为2017:
SELECT id FROM your_table_name GROUP BY id HAVING MIN(year) = 2017 AND MAX(year) = 2017;
方法二:子查询排除法
先找出所有存在非2017年记录的id,再从原表中排除这些id:
SELECT DISTINCT id FROM your_table_name WHERE id NOT IN ( SELECT DISTINCT id FROM your_table_name WHERE year != 2017 );
方法三:条件计数匹配
统计每个id的总记录数,与该id在2017年的记录数对比,两者相等则说明仅存在2017年的记录:
SELECT id FROM your_table_name GROUP BY id HAVING COUNT(*) = COUNT(CASE WHEN year = 2017 THEN 1 END);
以上三种方法均可得到目标结果:仅显示id=3的数据。
内容的提问来源于stack exchange,提问作者DENIS SETIAJI
相关产品推荐
相关产品推荐

