我想使用种子在我的表中添加一个带有随机数的列。如果我使用兰德:
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
我会在每一行中得到不同的值。)
编辑:
在我看到这里的评论之后,我设法以某种方式解决了这个问题 - 但它根本没有效率。如果有人知道如何改进它 - 它会很棒。如果没有 - 我将不得不找到另一种方式。
我在这里使用了示例的基本思想。
创建具有空白种子值的临时表:
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