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

Posted

技术标签:

【中文标题】计算 postgresql 数组的每个元素的中位数【英文标题】:Calculate median for each element of a postgresql array 【发布时间】:2021-01-06 21:30:37 【问题描述】:

我有一个 postgresql 表“样本”,其中包含一个由 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 percentile_disc(0.5) within group (order by i) from (select unnest(array[1,2,3,3,4,5]) AS i) AS a; percentile_disc ----------------- 3 【参考方案1】:

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

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;

如果你愿意,你可以将它重新聚合成一个数组。

【讨论】:

以上是关于计算 postgresql 数组的每个元素的中位数的主要内容,如果未能解决你的问题,请参考以下文章

求数组总和的中位数

13常见算法数组元素的区间查找

postgresql中的第n个百分位数计算

sql 计算Postgresql中的百分位数

2019.12.10 二位数组

查找中位数而不排序数组