我正在两个不同的@withStyle
上运行两个查询,一个是SQL Server instances
,另一个是"13.0.4474.0"
。
他们计算约"13.0.4411.0"
的同一集合中的STDEV
。
8K 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)有关?
答案 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假定的数字四舍五入效应