我有一张像这样的桌子:
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
结果将用于创建第二个表,我不在乎这个新表上的索引,它可以提供自己的索引,因此给出上面已经指出的结果。
答案 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