求助:如何用SQL计算各行业板块的收益率平均值并得到预期结果?
如何计算各行业板块的收益率平均值并关联到每只股票?
你当前的SQL代码无法得到预期结果,核心问题是分组逻辑错误:你按Stocks, Returns, Sector分组,这会让AVG(Returns)仅计算单只股票自身的收益率(每个股票的Returns是唯一分组项),而非整个板块的平均收益率。
正确解决方案
以下两种方法均可实现需求,根据你的数据库版本选择:
方法1:使用窗口函数(推荐,适用于MySQL 8.0+、PostgreSQL、SQL Server等现代数据库)
窗口函数可以直接在原表上按板块计算平均值,并将结果映射到每一行:
SELECT Stocks, AVG(Returns) OVER (PARTITION BY Sector) AS Returns, Sector FROM table1;
PARTITION BY Sector:将数据按行业板块分组AVG(Returns) OVER (...):计算每个分组的平均收益率,并将该值填充到分组内的所有行
方法2:子查询关联(兼容旧版数据库)
先通过子查询计算各板块的平均收益率,再通过Sector字段关联原表:
SELECT t1.Stocks, t2.SectorAvgReturns AS Returns, t1.Sector FROM table1 t1 INNER JOIN ( -- 子查询计算每个板块的平均收益率 SELECT Sector, AVG(Returns) AS SectorAvgReturns FROM table1 GROUP BY Sector ) t2 ON t1.Sector = t2.Sector;
验证结果
执行上述代码后,会得到与你预期完全一致的输出:
| Stocks | Returns | Sector |
|---|---|---|
| MS | 5.0 | IT |
| APPL | 5.0 | IT |
| GEICO | 5.0 | IT |
| PETRO | 8.5 | OIL |
| BP | 8.5 | OIL |
| Citiz | 7.0 | ENERGY |
| Utility | 7.0 | ENERGY |
内容的提问来源于stack exchange,提问作者kumas srunk
相关产品推荐
相关产品推荐

