如何用HAVING子句返回多行子查询结果?含MAX面积查询需求
用HAVING子句获取每个城镇最高resale_value对应的最小floor_area_sqm
需求说明
需要实现SQL查询,基于HAVING子句返回所有城镇(如26个)的数据,要求每条数据对应该城镇中resale_value最高的记录里,floor_area_sqm最小的那一行。当前查询仅返回1行,需修正。
测试数据
| Town | floor_area_sqm | resale_value |
|---|---|---|
| toronto | 30 | 4500 |
| chicago | 44 | 300 |
| toronto | 22 | 3000 |
| sydney | 54 | 3098 |
| pittsburg | 102 | 2000 |
| sydney | 101 | 2000 |
| pittsburg | 129 | 2000 |
当前错误查询及结果
错误查询语句
SELECT town, floor_area_sqm, resale_price FROM X.flat_prices as X GROUP BY town HAVING Min(floor_area_sqm) = (SELECT MIN(floor_area_sqm) FROM X.flat_prices HAVING MAX(resale_price));
注:语句中
resale_price应为resale_value,属于字段名笔误;且子查询未关联城镇,是全局查询,导致仅匹配到1条结果。
当前返回结果
| Town | floor_area_sqm | resale_value |
|---|---|---|
| chicago | 44 | 300 |
期望返回结果
| Town | floor_area_sqm | resale_value |
|---|---|---|
| chicago | 44 | 300 |
| toronto | 22 | 3000 |
| sydney | 54 | 3098 |
| pittsburg | 102 | 2000 |
解决方案
修正后的HAVING子句查询
通过关联子查询绑定当前城镇,确保每个城镇都能筛选出自身最高resale_value对应的最小floor_area_sqm:
SELECT town, MIN(floor_area_sqm) AS floor_area_sqm, MAX(resale_value) AS resale_value FROM X.flat_prices fp GROUP BY town HAVING MAX(resale_value) = ( SELECT MAX(resale_value) FROM X.flat_prices WHERE town = fp.town );
逻辑说明:
- 按
town分组,先计算每个城镇的最高resale_value和最小floor_area_sqm- HAVING子句通过关联子查询验证,确保当前分组的最高
resale_value确实是该城镇的全局最高值- 最终返回每个城镇符合要求的记录
复用逻辑查询MAX floor_area_sqm(无需JOIN)
不需要使用JOIN,同样可以用HAVING子句实现。比如要获取每个城镇最高resale_value对应的最大floor_area_sqm:
SELECT town, MAX(floor_area_sqm) AS floor_area_sqm, MAX(resale_value) AS resale_value FROM X.flat_prices fp GROUP BY town HAVING MAX(resale_value) = ( SELECT MAX(resale_value) FROM X.flat_prices WHERE town = fp.town );
如果需要返回原始记录而非聚合值,也可以用以下写法:
SELECT town, floor_area_sqm, resale_value FROM X.flat_prices fp WHERE resale_value = ( SELECT MAX(resale_value) FROM X.flat_prices WHERE town = fp.town ) GROUP BY town, resale_value HAVING floor_area_sqm = MAX(floor_area_sqm);
内容的提问来源于stack exchange,提问作者JoseJondoe
相关产品推荐
相关产品推荐

