SQL 加权平均值

Posted

技术标签:

【中文标题】SQL 加权平均值【英文标题】:SQL weighted average 【发布时间】:2016-10-17 03:23:51 【问题描述】:

有一个如下表。

make   | model | engine | cars_checked | avg_mileage
---------------------------------------|--------
suzuki | sx4   | petrol | 11           | 12
suzuki | sx4   | diesel | 150          | 16
suzuki | swift | petrol | 140          | 15
suzuki | swift | diesel | 18           | 19
toyota | prius | petrol | 16           | 17
toyota | prius | hybrid | 250          | 24

想要的输出是

    发动机(汽油、柴油)的平均行驶里程 平均里程数 车型平均行驶里程

不能做一个简单的group by,因为需要考虑每条记录的样本数(cars_checked)的权重年龄,以避免平均值问题。

实现它的正确方法是什么?有没有办法考虑在group by 中进行加权平均的样本数量?

更新 - 为上述 #1 添加的输出格式作为示例

engine   | mileage_by_engine
--------------------------
petrol   | xx.z
diesel   | yy.z

【问题讨论】:

你能展示一下输出应该是什么样子吗? @vkp - 使用输出格式更新 【参考方案1】:
SELECT engine, SUM(cars_checked * avg_mileage) / SUM(cars_checked) AS avgMilageByEngine
FROM [YOUR_TABLE]
GROUP BY engine

SELECT make, SUM(cars_checked * avg_mileage) / SUM(cars_checked) AS avgMilageByMake
FROM [YOUR_TABLE]
GROUP BY make

SELECT model, SUM(cars_checked * avg_mileage) / SUM(cars_checked) AS avgMilageByModel
FROM [YOUR_TABLE]
GROUP BY model

【讨论】:

【参考方案2】:

简化查询的一种方法是使用grouping sets

select engine, make, model,
       sum(cars_check * avg_mileage) / sum(cars_checked) as avgMilage
from t
group by grouping sets ((engine), (make), (model));

输出格式仅在被聚合的列中具有非NULL值。

【讨论】:

以上是关于SQL 加权平均值的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server - 查询以根据每年的最后一个值计算加权平均值

永久加权平均成本计算 SQL Server 2008

获取区间内加权平均值的总和

计算相关性/加权算术平均 SQL

R语言计算加权平均值:weighted.mean函数计算加权平均值matrixStats包的weightedMean函数计算加权平均值SDMTools包的wt.mean函数计算加权平均值

Highcharts构建加权平均值图表