如何筛选满足双区间SUM条件的国家?SQL查询求助
问题分析与解决方法
你之前的查询核心问题是分组维度错误:把year加入了GROUP BY,导致每个分组仅对应单个国家的单个年份,根本无法同时满足两个跨年份区间的条件。
正确的思路是仅按countries分组,通过条件聚合分别计算两个时间段的values总和,再用HAVING筛选符合要求的国家,CASE语句刚好能实现这个逻辑。
正确查询语句(CASE实现条件聚合)
SELECT countries FROM diamonds_export_long GROUP BY countries HAVING -- 计算2015-2018年的values总和,非该区间年份计为0 SUM(CASE WHEN year BETWEEN '2015' AND '2018' THEN values ELSE 0 END) = 0 AND -- 计算2019-2022年的values总和,非该区间年份计为0 SUM(CASE WHEN year BETWEEN '2019' AND '2022' THEN values ELSE 0 END) > 1;
简化版查询(省略ELSE)
如果你的数据库支持(主流SQL数据库都兼容),可以省略CASE里的ELSE分支——不满足条件的行会返回NULL,SUM函数会自动忽略NULL值,效果和写ELSE 0一致:
SELECT countries FROM diamonds_export_long GROUP BY countries HAVING SUM(CASE WHEN year BETWEEN '2015' AND '2018' THEN values END) = 0 AND SUM(CASE WHEN year BETWEEN '2019' AND '2022' THEN values END) > 1;
为什么之前的查询失败?
- 第一个查询:
GROUP BY countries, year后,每个分组是「单个国家+单个年份」,得到的是某一年的总和,而非2015-2018整个区间的总合计,所以结果只是那些在该区间内某一年总和为0的国家,不符合需求。 - 第二个查询:同样分组到年份,单个分组的
year不可能同时属于2015-2018和2019-2022两个区间,HAVING里的两个条件永远无法同时成立,自然返回空结果。
内容的提问来源于stack exchange,提问作者David Azaryayev
相关产品推荐
相关产品推荐

