Sql 连续行对的平均值
我有一张这样的桌子:Sql 连续行对的平均值,sql,postgresql,aggregate,Sql,Postgresql,Aggregate,我有一张这样的桌子: id | value ---+------ 1 | 10 2 | 5 3 | 11 4 | 8 5 | 9 6 | 7 这个表中的数据实际上是成对的值,我需要取它们的平均值,结果应该是: pair_id | pair_avg --------+--------- 1 | 7.5 2 | 9.5 3 | 8 我还得到了一些其他信息,一对标志也可以帮助它们配对,尽管它们仍然必须按id顺序排列。我真的无法改变数据是如
id | value
---+------
1 | 10
2 | 5
3 | 11
4 | 8
5 | 9
6 | 7
这个表中的数据实际上是成对的值,我需要取它们的平均值,结果应该是:
pair_id | pair_avg
--------+---------
1 | 7.5
2 | 9.5
3 | 8
我还得到了一些其他信息,一对标志也可以帮助它们配对,尽管它们仍然必须按id顺序排列。我真的无法改变数据是如何呈现给我的
因为我更习惯于数组而不是SQL,所以我所能想到的就是我需要在表中循环并求和对。但我觉得这并不是很奇怪
使现代化
在做这个最小的例子时,我显然过于简化了。
由于我正在使用的表是多次选择的结果,因此ID将不太干净,很抱歉没有指定这一点
该表看起来更像:
id | value
----------
1 | 10
4 | 5
6 | 11
7 | 8
10 | 9
15 | 7
结果将用于创建第二个表,我不关心这个新表上的索引,它可以提供自己的索引,因此给出上面已经指出的结果。我认为您可以使用group by和算术:
select row_number() over (order by min(id)), min(id), max(id), avg(id)
from t
group by floor( (id - 1) / 2 );
我不知道为什么要在聚合后对ID重新编号。原始id似乎更有用。您可以通过对id列应用2除法来实现ceil功能,如以下select语句所示:
with t(id,value) as
(
select 1 , 10 union all
select 2 , 5 union all
select 3 , 11 union all
select 4 , 8 union all
select 5 , 9 union all
select 6 , 7
)
select ceil(id/2::numeric) as "ID", avg(t.value) as "pair_avg"
from t
group by "ID"
order by "ID";
id | pair_avg
-------------
1 | 7.5
2 | 9.5
3 | 8
如果您的数据像问题所显示的那样干净:没有空值,没有间隙,成对的数据都是连续的正数,从1开始,假设id是integer类型,那么它可以简单到:
SELECT (id+1)/2 AS pair_id, avg(value) AS pair_avg
FROM tbl
GROUP BY 1
ORDER BY 1;
截断结果,从而以这种方式自动处理分组对
如果您的id号不是常规的,但至少与更新建议的一样,仍然没有空值或缺少值,则可以使用生成的代理项id来代替:
dbfiddle谢谢,不幸的是,我的最小示例太小了。我已经用更多信息更新了这个问题。@RDavies:我添加了第二个解决方案来涵盖您的更新。
SELECT id/2 AS pair_id, avg(value) AS pair_avg
FROM (SELECT row_number() OVER (ORDER BY id) + 1 AS id, value FROM tbl) t
GROUP BY 1
ORDER BY 1;