用于计算每 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的主要内容,如果未能解决你的问题,请参考以下文章

优化平均值 SQL 查询的平均值

8.聚集函数 ---SQL

sql查找数据并计算平均值

sql计算机系的平均成绩为多少?

用于计算运行平均列的 SQL Select 语句

如何计算 n 行的平均值并将答案粘贴到 pandas 列的下 n 行?