连续行对的平均值

问题描述 投票:1回答:3

我有一张像这样的桌子:

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更习惯于数组,所以我能想到的是我需要遍历表并对这些对进行求和。但这并不像SQL-ish那样让我感到震惊。

Update

在制作这个最小的例子时,我显然已经过度简化了。由于我正在使用的表是多次选择的结果,因此ID不会非常干净,对于不指定这一点表示歉意。

该表看起来更像:

id | value
----------
1  | 10
4  | 5
6  | 11
7  | 8
10 | 9
15 | 7

结果将用于创建第二个表,我不关心这个新表的索引,它可以自己提供,因此给出了上面已经指出的结果。

sql postgresql aggregate
3个回答
1
投票

如果您的数据看起来像问题一样干净:没有NULL值,没有间隙,对有连续的正数,从1开始,假设idinteger类型,它可以很简单:

SELECT (id+1)/2 AS pair_id, avg(value) AS pair_avg
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

Integer division截断结果,因此以这种方式自动分组对。

如果您的ID号不是常规但至少strictly monotonically increasing就像您的更新建议的那样(仍然没有NULL或缺少值),您可以使用row_number()生成的代理ID:

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;

db <>小提琴here


1
投票

我想你可以使用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似乎更有用。


1
投票

您可以通过将除以2除以use列来qazxsw poi qazxsw poi函数,如下面的select语句中所示:

ceil
© www.soinside.com 2019 - 2024. All rights reserved.