我的问题与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一样简单地使用它,但任何想法都会受到赞赏。
将其翻转到
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;