plsql中的stddev函数给我错误的值

时间:2018-09-24 17:25:23

标签: oracle plsql

我需要在plsql中计算stddev函数,但是当我将值与Java程序进行比较时,它是不同的。

当我使用plsql时,我需要获取这组值(10​​0,104,105,103,110,115,130,95,91,105,106,101,65,91,95)的stddev函数的值是:14.032,使用java时的值为13.557。您能否使用oracle plsql帮助获得正确的值

2 个答案:

答案 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