在不同的SQL Server上计算的标准差的差异

时间:2018-07-27 14:13:47

标签: sql-server standard-deviation

我正在两个不同的@withStyle上运行两个查询,一个是SQL Server instances,另一个是"13.0.4474.0"

他们计算约"13.0.4411.0"的同一集合中的STDEV8K bigint numbers的结果与众不同!

我确定这些数字是相同的,因为在应用STDEV之前,我选择了所有数字并进行比较。他们。是。的。相同。 (我将这两个集合放在Excel中,对它们进行排序,并在各行上取差异。它总是出现0,所以它们是相同的)

  • 他们的STDEV是相同的。
  • 他们的Sum是相同的。

Count稍有不同:

STDEV

如果我计算出2880.01921436887 and 2880,01956854958 中相同数字的STDEV,则会得到第三个数字,但是在这种情况下,谁在乎,那一定是由于两个程序中实现的原因。

但是为什么要在同一个SQL Server中?

我正在使用的查询没有Excel(这使函数不确定)

这是第一台机器上的代码:

OVER nor ORDER BY

这些数字不会通过任何过程更改。选择将继续吐出相同的两个不同数字。

在第二台计算机上,查询是完全相同的,但字段和表的名称除外,因为我在另一台计算机上。再一次,如果我只是使用相同的查询(只是使用*而不是COUNT,SUM,STDEV)来收集数字,我将得到相同的数字。

我做了很多尝试,我发现如果我在一台机器上将最大的bigint数精确地加1,那么我得到的STDEV与第二台机器上的STDEV相同。如果我在任何其他数字上仅加1,则ST.DEV不会改变,这是更自然的事情,因为这些数字为1亿数量级且为8 000,因此仅对其中一个加1不应更改前11个小数位的st.dev。

我想这是由于四舍五入引起的,但我无法完全理解。


[编辑]

过了一会儿,我来到了这个非常奇怪的地方:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

SELECT 
    COUNT_BIG(*) AS C, 
    SUM(CAST(MyBigintField AS BIGINT)) AS S, 
    STDEV(MyBigintField) AS D 
FROM 
    dbo.myTable 
WHERE 
    MyBigintField >= 108000000 
    AND MyBigintField < 108010000

这给了我myCount = 50(正确)和myStDev = 0(在两台机器上) 我检查了一下,CTE正确地给了我1900000001和1900000050(包括两者)的50个数字。

那怎么可能?

如果我再试一次,但范围达到1900000150,则STDev不同于0,但似乎与用Excel计算的值不同(我尝试了ST.DEV.P和ST.DEV.S)

也许这与我正在处理其bigint数字(其值非常接近maxint)有关?

1 个答案:

答案 0 :(得分:0)

这里有一个CTE来检查任何一组值-如果您更改'd'中的SQL以返回任何别名为y的数字列表,那么您应该得到'theirSD'等于'mySD'-如果两个不同的服务器给出不同的值,那么我期望sigma,sigma2或n会有所不同

我根据s.d的定义进行了自己的计算,即(x-mu)平方的总和,然后除以n-1(在这种情况下)

with d as (select  cast(x as float) y from tempt)
    ,calcs as (select  stdev(y) theirSD, 
                        avg(y) theirAV,
                        sum(y) Sigma,
                        sum(y *y) sigma2,
                        sum(y) / count(0) myAV,
                        count(0) n
                        from d) 
    select *, sqrt((sigma2 - sigma/n * sigma ) / (n-1)) mysd     from calcs

我的公式需要强制转换为浮点数-如果留在bigint上,由于四舍五入的关系,它不太适合,但是使用bigint时,它们的形状仍然正确

我认为您需要检查数据中的sum(x * x)因子,然后如果COUNT和SUM(x)看起来相同,那可能是Jeroem假定的数字四舍五入效应