将 Igor 的碎片换成另一种形式:
select id, array300, (
select array_agg(z) from
(
select avg(x) from
(
select x, ntile(array_length(array300,1)/3) over() from unnest(array300) x
) y
group by ntile
) z
) array100
from your_table
对于这样的小示例表
id | array300
----+-----------------------
1 | {110,25,53,110,25,53}
2 | {56,75,59,110,25,53}
3 | {65,93,82,110,25,53}
4 | {75,70,80,110,25,53}
结果是:
id | array300 | array100
----+-----------------------+-----------------------------------------------
1 | {110,25,53,110,25,53} | {(62.6666666666666667),(62.6666666666666667)}
2 | {56,75,59,110,25,53} | {(63.3333333333333333),(62.6666666666666667)}
3 | {65,93,82,110,25,53} | {(80.0000000000000000),(62.6666666666666667)}
4 | {75,70,80,110,25,53} | {(75.0000000000000000),(62.6666666666666667)}
(4 rows)
编辑我的第一个版本使用了修复ntile(2)
。这仅适用于大小为 6 的源数组。我已通过改用来解决此问题array_length(array300,1)/3
。