如何为多车型计算均价并筛选低于均价的车辆(不硬编码)
解决多车型均价筛选问题的方案
这问题我太熟了!要不用硬编码就能处理所有车型,窗口函数就是最优解,完全不用给每个车型单独写查询再拼接。
核心思路
我们可以用窗口函数里的 AVG() OVER (PARTITION BY 车型字段),它能帮我们按车型分组,自动计算每个车型的平均价格,并且把这个均价关联到该车型的每一条数据上。之后只需要筛选出价格低于对应车型均价的记录就行,一次查询搞定所有车型。
具体SQL示例
假设你的carversions表中,车型字段是model,价格字段是price,其他字段比如车辆ID、名称等按需保留。这里提供两种写法,选你习惯的就行:
写法一:用CTE(可读性更高)
WITH model_avg_cte AS ( SELECT *, -- 按车型分组计算均价,每条数据都带上所属车型的均价 AVG(price) OVER (PARTITION BY model) AS model_avg_price FROM carversions ) -- 筛选出价格低于对应车型均价的车辆 SELECT id, model, price, model_avg_price FROM model_avg_cte WHERE price < model_avg_price ORDER BY model, price; -- 按车型和价格排序,方便查看
写法二:子查询(更简洁)
SELECT id, model, price, model_avg_price FROM ( SELECT *, AVG(price) OVER (PARTITION BY model) AS model_avg_price FROM carversions ) AS sub WHERE price < model_avg_price ORDER BY model, price;
注意事项
- 把示例里的
model和price替换成你表中实际的车型字段名和价格字段名就行; - 这个查询会自动处理所有存在的车型,不管新增多少种,都不需要修改代码,彻底摆脱硬编码;
- 如果有需要,你可以在SELECT里添加其他字段(比如车辆年份、配置等),不影响核心逻辑。
内容的提问来源于stack exchange,提问作者sqlnoob
相关产品推荐
相关产品推荐

