我有一张像这样的桌子:
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那样让我感到震惊。
在制作这个最小的例子时,我显然已经过度简化了。由于我正在使用的表是多次选择的结果,因此ID不会非常干净,对于不指定这一点表示歉意。
该表看起来更像:
id | value
----------
1 | 10
4 | 5
6 | 11
7 | 8
10 | 9
15 | 7
结果将用于创建第二个表,我不关心这个新表的索引,它可以自己提供,因此给出了上面已经指出的结果。
如果您的数据看起来像问题一样干净:没有NULL值,没有间隙,对有连续的正数,从1开始,假设id
是integer
类型,它可以很简单:
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
我想你可以使用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似乎更有用。
您可以通过将除以2除以use列来qazxsw poi qazxsw poi函数,如下面的select语句中所示:
ceil