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 - 查询以根据每年的最后一个值计算加权平均值
R语言计算加权平均值:weighted.mean函数计算加权平均值matrixStats包的weightedMean函数计算加权平均值SDMTools包的wt.mean函数计算加权平均值