SQL Server的随机种子使用(SQL Server random using seed)

2019-10-20 23:38发布

我想将列添加到我的表使用种子的随机数。 如果我使用RAND:

select *, RAND(5) as random_id from myTable

我得到了所有的行相等的值(0.943597390424144为例),在random_id列。 我想这个值是每一行不同 - 对于每一次我将再次传递0.5的值(例如),这将是相同的值(如种子应该工作...)。

我怎样才能做到这一点?

(例如,在我PostrgreSql可以写

SELECT setseed(0.5); SELECT t.* , random() as random_id FROM myTable t

我会在每一行中得到不同的值。 )


编辑:

我看到这里的评论后,我设法以某种方式来解决这一问题 - 但它不是有效的。 如果有人有一个想法,如何改进它 - 这将是巨大的。 如果没有 - 我将不得不另谋出路。

我使用的例子的基本思想在这里 。

创建空白种子值的临时表

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

Answer 1:

我想获得一个可重复的随机ID在一个表中的最简单的方法是使用row_number()或一个固定的id上的每一行。 让我假设你有一个名为列id与各行不同的值。

这个想法就是要以此为种子:

select rand(id*1), as random_id
from mytable;

请注意,此ID的种子是一个整数,而不是一个浮点数。 如果你想要一个浮点种子,你可以做的东西checksum()

select rand(checksum(id*0.5)) as random_id
. . .

如果你这样做了采样(你会说random_id < 0.1为例如10%的样品,然后我经常用模运算的row_number()

with t as (
      select t.* row_number() over (order by id) as seqnum
      from mytable t
     )
select *
from t
where ((seqnum * 17 + 71) % 101) < 0.1

这将返回的数字(好吧,真的一百○一分之一十)的约10%。 你可以通过与常数摆弄调整样品。



Answer 2:

有人sugested类似的查询使用NEWID(),但我给你,为我的作品的解决方案。

有涉及NEWID()代替兰特一种解决方法,但它给你同样的结果。 您可以单独或作为一列一列执行它。 这将导致每行一个随机值,而不是在SELECT语句中的每一行相同的值。 如果你需要从0随机数 - N,只是改变100所需的号码。

SELECT TOP 10 [Flag forca]
,1+ABS(CHECKSUM(NEWID())) % 100 AS RANDOM_NEWID
,RAND() AS  RANDOM_RAND
FROM PAGSEGURO_WORK.dbo.jobSTM248_tmp_leitores_iso



Answer 3:

因此,在情况下,它会有人有一天,这里就是我最终没有。

我在服务器端(Java在我的情况),生成随机种子值,然后创建一个表有两列:id和产生random_id。 现在,我创建视图作为inner join表和原始数据之间。

生成的SQL看起来就像这样:

CREATE TABLE SEED_DATA(source_id INT PRIMARY KEY, random_id float NOT NULL);
select Rand(5); 
insert into SEED_DATA values(1,Rand());
insert into SEED_DATA values(2, Rand());
insert into SEED_DATA values(3, Rand());
.
.
.
insert into SEED_DATA values(1000000, Rand());

CREATE VIEW DATA_VIEW
as  
    SELECT row_number() OVER (ORDER BY random_id, id) AS source_id,column1,column2,...
    FROM 
        ( select * from SEED_DATA tmp 
          inner join my_table i on tmp.source_id = i.id) TEMP 

另外,我在批次10000左右,每批次(可能更高)创建随机数,所以不会有很大的影响在服务器端,并为每个批次我把它插入到表中单独执行。

所有这一切,因为我无法找到一个好办法做我在SQL要纯粹。 行后更新的行真的是没有效率的。

我自己从这个故事的结论是,SQL Server的是有时候真的很烦......



Answer 4:

你可以随机数种子转换:

rand(row_number over (order by ___, ___,___))

再投,作为一个VARCHAR,然后用最后3个字符作为另一个种子。 这会给你一个很好的随机值:

rand(right(cast(rand(row_number() over(x,y,x)) as varchar(15)), 3)


文章来源: SQL Server random using seed