表达式rand(checksum(newid()))
通常用于生成随机数。
在生成一些测试数据时,我执行了以下语句:
select rand(checksum(newid())) R1, rand(checksum(newid())) R2
from ftSequence(3)
whereftSequence(N)
是一个表函数,它返回单个列N
和1, 2, 3 ... N
其行中的值(与参数一样多N
)。运行它会产生非常预期的数据:
R1 R2
---------------------- ----------------------
0,817 0,9515
0,3043 0,3947
0,5336 0,7963
然后有必要在每一列中找到总和,我做了:
select sum(rand(checksum(newid()))) S1, sum(rand(checksum(newid()))) S2
from ftSequence(3)
令人惊讶的是,我在每一列中得到了相同的数字:
S1 S2
---------------------- ----------------------
1,2276 1,2276
为什么会发生?和聚合函数avg
的行为相同。是查询优化器,还是我错过了一些逻辑?min
max
评论后的更多观察。
放入CTEsum(rand(checksum(newid())))
或子查询中
select
(select sum(rand(checksum(newid()))) from ftSequence(3)) S1,
(select sum(rand(checksum(newid()))) from ftSequence(3)) S2
或者
select sum(R1) S1, sum(R2) S2
from (
select rand(checksum(newid())) R1, rand(checksum(newid())) R2
from ftSequence(3)
) R
以及做一个像
select
sum(rand(checksum(newid()))) S1
, sum(rand(checksum(newid())) + 0) S2
from ftSequence(3)
工作,导致不同的价值
S1 S2
---------------------- ----------------------
0,7349 1,478
很高兴,并且需要生产不止一排的几个不同的avg(rand(checksum(newid()))) from ftSequence(3)
,我做了以下
select R.*
from ftSequence(3) S1
cross join (
select
avg(rand(checksum(newid()))) R1,
avg(rand(checksum(newid())) + 0) R2
from ftSequence(3)
) R
并得到以下结果:
R1 R2
---------------------- ----------------------
0,6464 0,4501
0,6464 0,4501
0,6464 0,4501
在这一点上,我无法回答自己,这是正确的结果,还是值应该都是随机的?使所有值随机的方法是什么?