Как сгенерировать случайное число для каждой строки в TSQL Select? - PullRequest
291 голосов
/ 25 июня 2009

Мне нужно другое случайное число для каждой строки в моей таблице. Следующий, казалось бы, очевидный код использует одно и то же случайное значение для каждой строки.

SELECT table_name, RAND() magic_number 
FROM information_schema.tables 

Я бы хотел получить INT или FLOAT из этого. В остальной части истории я собираюсь использовать это случайное число для создания случайного смещения даты относительно известной даты, например Смещение на 1-14 дней от даты начала.

Это для Microsoft SQL Server 2000.

Ответы [ 18 ]

4 голосов
/ 25 июня 2009

попробуйте использовать начальное значение в RAND (seedInt). RAND () будет выполняться только один раз для каждого оператора, поэтому каждый раз вы видите одно и то же число.

4 голосов
/ 07 ноября 2017
select round(rand(checksum(newid()))*(10)+20,2)

Здесь случайное число будет в диапазоне от 20 до 30. round даст два десятичных знака максимум.

Если вы хотите отрицательные числа, вы можете сделать это с помощью

select round(rand(checksum(newid()))*(10)-60,2)

Тогда минимальное значение будет -60, а максимальное - -50.

2 голосов
/ 24 октября 2017
select ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) as [Randomizer]

всегда работал для меня

2 голосов
/ 25 июня 2009

выберите newid ()

или, возможно, это select binary_checksum (newid ())

2 голосов
/ 04 апреля 2015

Проблема, с которой я иногда сталкиваюсь с выбранным «Ответом», заключается в том, что распределение не всегда четное. Если вам нужно очень равномерное распределение случайных чисел от 1 до 14 среди большого количества строк, вы можете сделать что-то вроде этого (моя база данных имеет 511 таблиц, так что это работает. Если у вас меньше строк, чем у диапазона случайных чисел, это не работает хорошо):

SELECT table_name, ntile(14) over(order by newId()) randomNumber 
FROM information_schema.tables

Этот тип противоположен нормальным случайным решениям в том смысле, что он поддерживает последовательность чисел и рандомизирует другой столбец.

Помните, у меня есть 511 таблиц в моей базе данных (что относится только к тому, что мы выбираем из информационной_схемы). Если я беру предыдущий запрос и помещаю его во временную таблицу #X, а затем запускаю этот запрос для полученных данных:

select randomNumber, count(*) ct from #X
group by randomNumber

Я получаю этот результат, показывая, что мое случайное число ОЧЕНЬ равномерно распределено по множеству строк:

enter image description here

2 голосов
/ 30 октября 2018

Это так же просто, как:

DECLARE @rv FLOAT;
SELECT @rv = rand();

И это поместит в таблицу случайное число от 0 до 99:

CREATE TABLE R
(
    Number int
)

DECLARE @rv FLOAT;
SELECT @rv = rand();

INSERT INTO dbo.R
(Number)
    values((@rv * 100));

SELECT * FROM R
1 голос
/ 27 июня 2018
    DROP VIEW IF EXISTS vwGetNewNumber;
    GO
    Create View vwGetNewNumber
    as
    Select CAST(RAND(CHECKSUM(NEWID())) * 62 as INT) + 1 as NextID,
    'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ'as alpha_num;

    ---------------CTDE_GENERATE_PUBLIC_KEY -----------------
    DROP FUNCTION IF EXISTS CTDE_GENERATE_PUBLIC_KEY;  
    GO
    create function CTDE_GENERATE_PUBLIC_KEY()
    RETURNS NVARCHAR(32)
    AS 
    BEGIN
        DECLARE @private_key NVARCHAR(32);
        set @private_key = dbo.CTDE_GENERATE_32_BIT_KEY();
        return @private_key;
    END;
    go

---------------CTDE_GENERATE_32_BIT_KEY -----------------
DROP FUNCTION IF EXISTS CTDE_GENERATE_32_BIT_KEY;  
GO
CREATE function CTDE_GENERATE_32_BIT_KEY()
RETURNS NVARCHAR(32)
AS 
BEGIN
    DECLARE @public_key NVARCHAR(32);
    DECLARE @alpha_num NVARCHAR(62);
    DECLARE @start_index INT = 0;
    DECLARE @i INT = 0;
    select top 1 @alpha_num = alpha_num from vwGetNewNumber;
        WHILE @i < 32
        BEGIN
          select top 1 @start_index = NextID from vwGetNewNumber;
          set @public_key = concat (substring(@alpha_num,@start_index,1),@public_key);
          set @i = @i + 1;
        END;
    return @public_key;
END;
    select dbo.CTDE_GENERATE_PUBLIC_KEY() public_key;
0 голосов
/ 18 апреля 2019

Обновить my_table set my_field = CEILING ((RAND (CAST (NEWID () AS varbinary)) * 10))

Число от 1 до 10.

...