繁体   English   中英

SQL - 具有相同 ID 的项目的每 n 行平均值

[英]SQL - Average every n rows for items with same ID

我发现了很多类似的帖子,但其中任何一个都回答了我所需要的。 我试图总结一个大表(200M 行)。 我需要的是为每个 ID 获取每个 n(5 或类似的东西)的平均值。 我一直在尝试这个:

select id, dev_id,
    row_number() over(partition by dev_id order by dev_id) as rn,
    avg(med1) over(order by dev_id rows between current row and 5 following) as avg_med1,
    avg(med2) over(order by dev_id rows between current row and 5 following) as avg_med2
from my_table;

我通过该查询得到的是移动平均值,但是,我只想要当前 id 的 n 个元素的平均值。 所以 output 应该是 ID x > avg(第 1-5 行),对于 ID x > avg(第 6-10 行),对于 ID y > avg(第 11-15 行)...

我试图复制的东西如下所示:

从:

dev_id, med1, med2, med3
2, 3, 4, 1
3, 2, 1, 2
3, 1, 3, 9
3, 2, 4, 7
1, 3, 3, 2
2, 4, 3, 2
1, 5, 3, 2
3, 4, 2, 3
2, 4, 7, 2

到:

dev_id, AVG(med1), AVG(med2), AVG(med3)
2, 3.5, 3.5, 1.5
3, 1.5, 2, 5.5
3, 3, 3, 5
1, 4, 3, 2
2, 4, 5, 2

这最终对我有用,但不是我最初计划的:

select id, reference, avg(b1), avg(b25), avg(b10), max(created_at)
from
(
  select id,
    @row_number := case when @reference = reference then @row_number + 1 else 0 end as row_number,
    @reference := reference as reference,
    b1, 
    b25,
    b10,
    created_at
  from history_air
  cross join (select @row_number := -1, @reference := '') as t
  order by reference, created_at
) as t
group by reference, row_number div 150
order by reference, row_number div 150;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM