You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将SQL分组查询结果的Avg_MPG与CO2Avg_withoutEV列存入原表?

如何将分组统计结果作为新列添加到原表中?

我已经编写了如下SQL查询,按年份分组统计非电动车型的平均油耗(Avg_MPG)和平均尾气CO₂排放(CO2Avg_withoutEV):

select year, 
 avg(combined_mpg_ft1) as Avg_MPG, 
 avg(tailpipe_co2_in_grams_mile_ft1) as CO2Avg_withoutEV
from fuel$
where fuel_type_1 <> 'Electricity'
group by year
order by year desc

查询结果示例:

year    Avg_MPG             CO2Avg_withoutEV
2017    23.3069727891156    403.622448979592
2016    23.2543068088597    401.520098441345
2015    22.9001597444089    410.376198083067
...
1984    19.8818737270876    489.237133709112

现在需要将这两个统计列作为新列存入原fuel$表,用于后续计算,该如何操作?


操作步骤

1. 为原表添加新列

首先在fuel$表中创建两个新列,根据数据精度需求调整小数位数:

-- 适配MySQL、SQL Server、PostgreSQL等主流数据库
ALTER TABLE fuel$
ADD COLUMN Avg_MPG DECIMAL(15,13),
ADD COLUMN CO2Avg_withoutEV DECIMAL(15,13);

2. 批量更新表填充统计值

根据你使用的数据库类型,选择对应的更新语句:

MySQL 版本

通过JOIN关联分组统计结果与原表,批量更新:

UPDATE fuel$ f
JOIN (
    SELECT year, 
           avg(combined_mpg_ft1) as Avg_MPG, 
           avg(tailpipe_co2_in_grams_mile_ft1) as CO2Avg_withoutEV
    FROM fuel$
    WHERE fuel_type_1 <> 'Electricity'
    GROUP BY year
) stats ON f.year = stats.year
SET f.Avg_MPG = stats.Avg_MPG,
    f.CO2Avg_withoutEV = stats.CO2Avg_withoutEV;
SQL Server 版本

使用UPDATE ... FROM语法关联子查询结果:

UPDATE f
SET f.Avg_MPG = stats.Avg_MPG,
    f.CO2Avg_withoutEV = stats.CO2Avg_withoutEV
FROM fuel$ f
INNER JOIN (
    SELECT year, 
           avg(combined_mpg_ft1) as Avg_MPG, 
           avg(tailpipe_co2_in_grams_mile_ft1) as CO2Avg_withoutEV
    FROM fuel$
    WHERE fuel_type_1 <> 'Electricity'
    GROUP BY year
) stats ON f.year = stats.year;
PostgreSQL 版本

使用UPDATE ... FROM语法完成更新:

UPDATE fuel$ f
SET Avg_MPG = stats.Avg_MPG,
    CO2Avg_withoutEV = stats.CO2Avg_withoutEV
FROM (
    SELECT year, 
           avg(combined_mpg_ft1) as Avg_MPG, 
           avg(tailpipe_co2_in_grams_mile_ft1) as CO2Avg_withoutEV
    FROM fuel$
    WHERE fuel_type_1 <> 'Electricity'
    GROUP BY year
) stats
WHERE f.year = stats.year;

可选:仅更新非电动车型记录

如果希望仅给非电动车型填充统计值,电动车型的新列保持NULL,可在更新语句中添加过滤条件:

-- 以MySQL为例,其他数据库调整WHERE位置即可
UPDATE fuel$ f
JOIN (
    SELECT year, 
           avg(combined_mpg_ft1) as Avg_MPG, 
           avg(tailpipe_co2_in_grams_mile_ft1) as CO2Avg_withoutEV
    FROM fuel$
    WHERE fuel_type_1 <> 'Electricity'
    GROUP BY year
) stats ON f.year = stats.year
SET f.Avg_MPG = stats.Avg_MPG,
    f.CO2Avg_withoutEV = stats.CO2Avg_withoutEV
WHERE f.fuel_type_1 <> 'Electricity';

替代方案:无需修改原表,动态计算

如果不需要永久存储统计值,仅在后续计算中使用,可通过窗口函数直接查询,避免修改表结构:

SELECT *,
       -- 按年份分组计算非电动车型的平均MPG
       AVG(CASE WHEN fuel_type_1 <> 'Electricity' THEN combined_mpg_ft1 END) OVER (PARTITION BY year) AS Avg_MPG,
       -- 按年份分组计算非电动车型的平均CO₂排放
       AVG(CASE WHEN fuel_type_1 <> 'Electricity' THEN tailpipe_co2_in_grams_mile_ft1 END) OVER (PARTITION BY year) AS CO2Avg_withoutEV
FROM fuel$;

内容的提问来源于stack exchange,提问作者Kaya Gore

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:30:35