计算 postgresql 数组的每个元素的中位数

Calculate median for each element of a postgresql array

我有一个 postgresql table“样本”,其中包含一个由 200 个整数组成的数组的“强度”列。我想为数组的每个元素计算一堆样本的中值,例如强度[1]的中值、强度[2]的中值、...、强度[200]的中值。如果该列由单个整数组成,那么使用 percentile_disc 函数会很容易:

select percentile_disc(0.5) within group (order by intensity) from samples where...

但是,由于我的专栏由一个数组组成,所以这不起作用。 运行 代码给出了强度 [1] 的正确答案,但所有其他值都是错误的(我怀疑代码只是从具有强度 [1] 中值的样本中提取了全部 200 个整数)。

我可能可以使用“for”循环来获取数据,但必须有一个更优雅的解决方案,使用 unnest 或类似的东西...

您需要取消嵌套数组并跟踪每个元素。那将是这样的:

select n, percentile_cont(0.5) within group (order by el) as median
from samples s cross join lateral
     unnest(s.ar) with ordinality u(el, n)
group by n;

您可以根据需要将其重新聚合到一个数组中。