如何获取 PostgreSQL 表的几列的行中位数?

问题描述 投票:0回答:1

我的问题与this非常相似,但我需要找到一行中不同列的中值,而不是平均值(以便识别一些异常值)。

假设我有下表:

X   Y    Z
-------------
6   3    3
5   6    NULL
4   5    6
11  7    8

我需要的是:

MEDIAN
-------------
3
5 or 5.5
5
8

如果非 NULL 元素数量为偶数,中位数可能只是中心值之一或平均值。我不太关心这个,任何版本都适合我。

理想情况下,我想将此解决方案定义为 PostgreSQL 函数,这样我就可以像GREATEST/LEAST一样简单地使用它,但任何想法都会受到赞赏。

sql postgresql
1个回答
0
投票

将其翻转到

jsonb
然后再翻转回来以使用
percentile_cont()
功能是一种懒惰的方法:

select t.*, percentile_cont(0.5) within group (order by e.v::int)
  from mytest t
       cross join lateral jsonb_each_text(to_jsonb(t)) e(k,v)
 group by t.x, t.y, t.z;

工作小提琴

© www.soinside.com 2019 - 2024. All rights reserved.