我想将列添加到我的表使用种子的随机数。 如果我使用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
我想获得一个可重复的随机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%。 你可以通过与常数摆弄调整样品。
有人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
因此,在情况下,它会有人有一天,这里就是我最终没有。
我在服务器端(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的是有时候真的很烦......
你可以随机数种子转换:
rand(row_number over (order by ___, ___,___))
再投,作为一个VARCHAR,然后用最后3个字符作为另一个种子。 这会给你一个很好的随机值:
rand(right(cast(rand(row_number() over(x,y,x)) as varchar(15)), 3)