我需要在plsql中计算stddev函数,但是当我将值与Java程序进行比较时,它是不同的。
当我使用plsql时,我需要获取这组值(100,104,105,103,110,115,130,95,91,105,106,101,65,91,95)的stddev函数的值是:14.032,使用java时的值为13.557。您能否使用oracle plsql帮助获得正确的值
答案 0 :(得分:0)
这是一个显式的SQL查询,该查询将获取您的数字并将其逐步通过the Standard Deviation calculation。
with t23 as (
select column_value as val
from table (sys.odcinumberlist(100,104,105,103,110,115,130,95,91,105,106,101,65,91,95))
)
, mn as (
select avg(val) as avg_val
, count(*) as cnt
from t23
) , inp as (
select t23.val
, t23.val - mn.avg_val as diff
, power(t23.val - mn.avg_val , 2) diff_sq
, mn.cnt
from t23 cross join mn
)
select sum(diff_sq) as sum_diff_sq
, sqrt( sum(diff_sq) / (cnt-1) ) as sd
from inp
group by cnt
;
SD的值为14.0329544118054
,这表明Oracle stddev()
函数是正确的,而您在Java中运行的任何内容都是错误的。
答案 1 :(得分:0)
@APC那里的代码很棒-我喜欢代码的本质:)
所以我今天也遇到了同样的问题,答案是Oracle根据两个不同的计算为标准偏差提供了两个内置函数:
a)stddev-用于标准偏差样本;和
b)stddev_pop标准偏差人口
select stddev(column_value), stddev_pop(column_value)
from table (sys.odcinumberlist(100,104,105,103,110,115,130,95,91,105,106,101,65,91,95))
示例
STDDEV(COLUMN_VALUE) STDDEV_POP(COLUMN_VALUE)
-------------------- ------------------------
14.0329544 13.5571219
因此,请使用适合您需求的那个...
一些有关标准偏差的信息,以及使用哪个here。