【发布时间】:2014-11-10 09:55:01
【问题描述】:
我想使用种子向我的表中添加一个带有随机数的列。 如果我使用兰德:
select *, RAND(5) as random_id from myTable
我在 random_id 列中得到所有行的相等值(例如 0.943597390424144)。我希望每一行的这个值都不同 - 并且每次我将传递 0.5 值(例如),它都会再次成为相同的值(因为种子应该可以工作......)。
我该怎么做?
( 比如在PostrgreSql中我可以写
SELECT setseed(0.5);
SELECT t.* , random() as random_id
FROM myTable t
我会在每一行中得到不同的值。 )
编辑:
在我看到这里的 cmets 之后,我设法以某种方式解决了这个问题 - 但它根本没有效率。 如果有人知道如何改进它 - 它会很棒。如果没有 - 我将不得不另谋出路。
我使用了here中示例的基本思想。
使用空白种子值创建临时表:
select * into t_myTable from (
select t.*, -1.00000000000000000 as seed
from myTable t
) as temp
为每个种子值添加一个随机数,一次一行(这是不好的部分......):
USE CPatterns;
GO
DECLARE @seed float;
DECLARE @id int;
DECLARE VIEW_CURSOR CURSOR FOR
select id
from t_myTable t;
OPEN VIEW_CURSOR;
FETCH NEXT FROM VIEW_CURSOR
into @id;
set @seed = RAND(5);
WHILE @@FETCH_STATUS = 0
BEGIN
set @seed = RAND();
update t_myTable set seed = @seed where id = @id
FETCH NEXT FROM VIEW_CURSOR
into @id;
END;
CLOSE VIEW_CURSOR;
DEALLOCATE VIEW_CURSOR;
GO
创建视图使用种子值并按其排序
create view my_view AS
select row_number() OVER (ORDER BY seed, id) AS source_id ,t.*
from t_myTable t
【问题讨论】:
-
AFIK 你不能模仿
setseed的行为,即始终产生相同的随机数,但要为每一行获得不同的随机数,而不是重复相同的随机数,你可以使用RAND(CHECKSUM(NEWID()))- 例如-SELECT RAND(CHECKSUM(NEWID())) FROM sys.all_objects -
@GarethD,我必须始终如一地产生相同的随机数 - 所以我发布了更新,请看一下。
-
我有点困惑。您的示例使用
rand(0.5),但在 SQL Server 中,rand()仅采用整数种子。 -
@Gordon Linoff... 对不起,我试图与 PostgreSql 示例保持一致,因此我也更改了 SQL Server 的值。我已经编辑了问题。
标签: sql sql-server random random-seed