计算 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 数组的每个元素的中位数的主要内容,如果未能解决你的问题,请参考以下文章