postgresql 如何转换jsonb数组和使用stats moment

oknwwptz  于 2022-12-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(135)

你好吗?
我需要在PostgreSQL中以JSONB的形式存储一个数字数组。
现在,我正试图从这个JSON计算统计时刻,我面临着一些问题。
我的数据示例:

我已经能够将JSON转换为浮点数组。

我使用了一个函数将jsonb转换为浮点数组。

CREATE OR REPLACE FUNCTION jsonb_array_castdouble(jsonb) RETURNS float[] AS $f$
    SELECT array_agg(x)::float[] || ARRAY[]::float[] FROM jsonb_array_elements_text($1) t(x);
$f$ LANGUAGE sql IMMUTABLE;

使用此SQL:

with data as (
        select
        s.id as id,
        jsonb_array_castdouble(s.snx_normalized) as serie
        FROM
          spectra s
)

select * from data;

我找到了一个可以进行这些计算的函数,我需要为此传递一个数组:https://github.com/ellisonch/PostgreSQL-Stats-Aggregate/
但是这个函数以另一种方式需要一个数组:不嵌套的

我已经尝试过使用unnest,但是它只会得到一个值,而不是整个数组:(。
我的目标是:
能够应用统计矩(峰度,偏度)的每一行。
例如:
| 指标|偏度|
| - ------|- ------|
| 1个|二十一二一三一|
| 第二章|一点一二三|
额外的好处:有一种方法可以不使用这个“with data”,而是在select语句中使用转换?

vtwuwzda

vtwuwzda1#

snx_wavelengths是JSON,对吗?而且你提供的是图片而不是文本:(数据看起来像(id,snx_wavelengths)-我相信你的意思是id表示index(使用关键字不是一个好主意,需要标识符双引号):

1,[1,2,3,4]
2,[373,232,435,84]

如果这是正确的:

select id, (stats_agg(v::float)).skewness
from myMeasures,
     lateral json_array_elements_text(snx_wavelengths) v
group by id;

DBFiddle demo
顺便说一句,如果你不想使用,你不需要在原始示例中使用“with data”,可以用一个子查询来替换。

select (stats_agg(n)).* from (select unnest(array[16,22,33,24,15])) data(n)
union all
select (stats_agg(n)).* from (select unnest(array[416,622,833,224,215])) data(n);


编辑:如果您还需要其他统计数据:

select id, "count","min","max","mean","variance","skewness","kurtosis"
from myMeasures,
     lateral (select (stats_agg(v::float)).* from json_array_elements_text(snx_wavelengths) v) foo
group by id,"count","min","max","mean","variance","skewness","kurtosis";

DBFiddle demo

相关问题