用于计算每 n 行的平均值的 SQL 查询,步骤 1
Posted
技术标签:
【中文标题】用于计算每 n 行的平均值的 SQL 查询,步骤 1【英文标题】:SQL query for calculating average in every n rows with step 1 【发布时间】:2017-01-15 00:44:07 【问题描述】:我有一些这样的数据
KEYS: id, score, user_id
VALUES:
1, 23, 2,
1, 23, 2,
2, 27, 2,
3, 42, 2,
4, 71, 2,
5, 11, 2
我需要 SQL,它将通过 STEP 1 返回每 3 行的 AVERAGE 得分的最大值
例如。
1st AVG = AVG(score) WHERE id IN 1,2,3
2st AVG = AVG(score) WHERE id IN 2,3,4
还有其他...
最后,我需要 MAX VALUE OF AVERAGES。
非常感谢
【问题讨论】:
您能否标记正在使用的实际 dbms 并删除无关的。 @vkp postgresql 【参考方案1】:使用 avg
窗口函数和窗口框架规范来考虑当前行和接下来的 2 行。我假设id
列是表中的主键。
select max(avg_score)
from (select avg(score) over(order by id rows between current row and 2 following) as avg_score
from t
) x
您应该从该结果中排除最后 2 行。因为
第 n 行的 avg_score=score 因为窗口中只有一行 第 (n-1) 行的 avg_score 将是(第 n 行的值 + 第 n-1 行的值)/2,因为窗口中只有 2 行要排除他们使用,
select max(avg_score)
from (select row_number() over(order by id desc) as rn
,avg(score) over(order by id rows between current row and 2 following) as avg_score
from t
) x
where rn > 2 --excluding the last 2 rows
如果需要对每个 user_id 进行上述操作,请添加 partition by
规范,如图所示。
select distinct user_id,max(avg_score) over(partition by user_id) as max_avg
from (select row_number() over(partition by user_id order by id desc) as rn
,avg(score) over(partition by user_id order by id rows between current row and 2 following) as avg_score
from t
) x
where rn > 2 --excluding the last 2 rows
【讨论】:
以上是关于用于计算每 n 行的平均值的 SQL 查询,步骤 1的主要内容,如果未能解决你的问题,请参考以下文章