SQL带RAND的多次插入-如何更改RAND值
我有一个语句,它根据一个随机值和另一个值将值插入到表中SQL带RAND的多次插入-如何更改RAND值,sql,sql-server,sql-insert,Sql,Sql Server,Sql Insert,我有一个语句,它根据一个随机值和另一个值将值插入到表中 INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate) SELECT AverageSteps * (RAND()*(1.15-0.85)+0.85), Id, GETDATE() FROM TRAINER 这很好,但每当两个“培训师”具有相同的“平均步骤”时,插入表中的数字总是相同的 例如,如果所有培训师的平均步数均为10000,则以下是TRAINER\u SYNC表中的结果 Id
INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate)
SELECT AverageSteps * (RAND()*(1.15-0.85)+0.85), Id, GETDATE()
FROM TRAINER
这很好,但每当两个“培训师”具有相同的“平均步骤”时,插入表中的数字总是相同的
例如,如果所有培训师的平均步数均为10000
,则以下是TRAINER\u SYNC
表中的结果
Id TrainerId SyncDate Steps
10 1 2018-10-20 18:42:16.407 9482
11 2 2018-10-20 18:42:16.407 9482
12 3 2018-10-20 18:42:16.407 9482
13 4 2018-10-20 18:42:16.407 9482
14 5 2018-10-20 18:42:16.407 9482
15 6 2018-10-20 18:42:16.407 9482
16 7 2018-10-20 18:42:16.407 9482
17 8 2018-10-20 18:42:16.407 9482
18 9 2018-10-20 18:42:16.407 9482
有没有办法使insert语句中的RAND()
更精确。。。“随机”?我不确定它叫什么,但是重置初始种子,这样插入的每次迭代都会给我一个不同的随机值?您可以使用
(一)
RAND(校验和(NEWID())
或
(二)
rand()。这可能会令人困惑,因为:
select rand(), rand()
返回两个不同的值。但是,
select rand(), rand()
from (values (1), (2), (3)) v(x)
返回三行——每行上有相同的两个值。这是SQL Server的优化“功能”。我相信getdate()
(以及类似的日期/时间函数)是唯一具有这种行为的其他函数
通常的解决方案是使用newid()
为随机数生成器种子。但是,返回类型不同,因此使用checksum()
将id
转换为数字:
INSERT INTO TRAINER_SYNC (Steps, TrainerId, SyncDate)
SELECT AverageSteps * (RAND(CHECKSUM(NEWID()))*(1.15-0.85)+0.85),
Id, GETDATE()
FROM TRAINER;
你可以使用不同的种子,如果有的话。例如,如果每个培训师只进入一行,您可以使用rand(id)
。我应该注意到,rand()
对于种子并不是特别“随机”的,所以相邻的种子通常会产生相似的数字
您可能不应该在插入中设置GETDATE()
。您可以使用以下方法创建表:
SyncDate datetime default getdate()
因此,默认值是插入时间。,至少对于MS SQL而言是这样Server@mint什么是数据库管理系统?@a_horse_和_no_名字听起来很愚蠢,我从来都不知道我用过什么数据库产品。。。我一直只使用SQL Server Management Studio,但我猜我使用的是SQL Server
SyncDate datetime default getdate()