Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 连续行对的平均值_Sql_Postgresql_Aggregate - Fatal编程技术网

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;