sql - 如何在 Hive/SQL 中使用权重列进行加权移动平均?
问题描述
我有一列weights
和一列recall
,我想计算recall
过去 7 天的加权平均值weights
,我已经有了计算移动平均值的查询OVER
语句,但是,为了计算加权移动平均值,我想我会有AVG
将聚合函数替换为其他一些需要两列的函数,例如WEIGHTED_AVG(recall, weights)
,有什么办法可以做到吗?这是我当前的查询。
SELECT
weights,
recall,
avg(recall) OVER(ROWS 6 PRECEDING) AS recall_ma_week FROM TableA;
示例TableA
是:
recall weight
0.5 3
0.2 2
0.3 4
0.4 2
0.3 6
0.2 8
例如,对于最后一行,我要计算的数字应该是
0.2*8 + 0.3*6 + ... / (8 + 6 + ...)
,在公式中是sum(weight * recall) / sum(weight)
,并且当 时sum(weight) == 0
,将该值返回为 1.0。如果我能够创建一个很棒的自定义聚合函数,但我不知道如何在纯 SQL 中做到这一点。
解决方案
只需使用算术:
SELECT (sum(recall * weight) OVER (ORDER BY report_created_at ASC ROWS 6 PRECEDING) /
(case when sum(weight) OVER (ORDER BY report_created_at ASC ROWS 6 PRECEDING), 0) <> 0
then sum(weight) OVER (ORDER BY report_created_at ASC ROWS 6 PRECEDING), 0)
end)
) AS recall_ma_week
推荐阅读
- java - 当前运行的应用程序及其输出控制台的 Eclipse 视图
- database - 数据库浏览器 SQLITE3
- django-models - 循环从 Django ManytoMany 文件中选择的值
- reactjs - ClassNames 与服务器解释不匹配
- java - 根据 HashMap 值/键更新列表元素
- c# - 如何为双引号选项内的文件路径编写ffmpeg windows命令
- php - DKMI 使用 phpmailer 无效
- spring - 多对多关系在 Spring JPA、Kotlin 中不存在
- c++ - 使用 GetComputerObjectNameW win API 时出现编译错误
- excel - 用户表单清除功能似乎不起作用