Я хочу добавить столбец в свою таблицу со случайным числом, используя seed. Если я использую 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
setseed
, т.е. постоянно создавать одни и те же случайные числа, но чтобы получить другое случайное число для каждой строки, а не повторять одно и то же, вы можете использоватьRAND(CHECKSUM(NEWID()))
- например,SELECT RAND(CHECKSUM(NEWID())) FROM sys.all_objects
- person GarethD   schedule 16.09.2014rand(0.5)
, но в SQL Serverrand()
принимает только целочисленное начальное число. - person Gordon Linoff   schedule 23.09.2014