连续两行对的平均值

时间:2018-09-17 16:03:47

标签: 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顺序排列,但它们也可能有助于将它们配对。我无法真正改变数据的发送方式。

由于我比SQL更习惯于数组,所以我能想到的是,我需要遍历表并将两对加起来。但是,这并不像SQL那样使我震惊。

更新

在做这个最小的例子时,我显然过于简化了。 由于我正在使用的表是多次选择的结果,因此ID不会很干净,对于未指定此ID表示歉意。

该表看起来更像:

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

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

2 个答案:

答案 0 :(得分:1)

您可以通过将{2除以ceil列来use id函数,如以下选择语句所示:

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 :(得分:1)

如果,您的数据看起来像问题所显示的一样干净:没有NULL值,没有空格,对具有从1开始的连续正数,并假设id是{ {1}},它可以很简单:

integer

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

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

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

db <>提琴here