具有随机分配值的UPDATE语句

时间:2018-07-30 15:37:09

标签: tsql azure-sql-database

我正在尝试为数据库综合生成一些种子值。我有一个员工列表,我希望将其中大约30%的员工归为“少数群体”,其余的归为“非少数群体”,我认为以下方法会起作用,但是将每个人都归为“少数群体”:

UPDATE datasetitems 
SET minority = CASE WHEN (FLOOR(RAND()*(10-1+1)+1) > 3) 
THEN 'Minority' ELSE 'Non-Minority' END;

1 个答案:

答案 0 :(得分:1)

对于您尝试执行的操作,RAND()将不起作用,因为它会为批次生成一个随机值,这就是为什么看不到任何差异的原因。要为每一行生成一个 随机值 ,请使用:

ABS(CHECKSUM(NEWID())%<desired max random number>)

请注意以下示例数据:

DECLARE @datasetitems TABLE (minority VARCHAR(20));
INSERT @datasetitems(minority)
SELECT TOP (10) NULL FROM sys.all_columns;

SELECT CASE ABS(CHECKSUM(NEWID())%2) WHEN 0 THEN 'minority' ELSE 'non-minority' END
FROM @datasetitems;

返回:

------------
non-minority
non-minority
minority
minority
minority
non-minority
minority
non-minority
minority
minority

ABS(CHECKSUM(NEWID())%2)将为每一行返回0或1,这意味着您将有50/50的机会返回少数派或非少数派。此逻辑:

SELECT CASE ABS(CHECKSUM(NEWID())%4) WHEN 0 THEN 'minority' ELSE 'non-minority' END
FROM @datasetitems;

...表示返回“少数群体”的机会为四分之一,而返回“非少数群体”的机会为四分之三。要将此逻辑应用于更新,您的代码应如下所示:

UPDATE @datasetitems
SET minority = CASE ABS(CHECKSUM(NEWID())%2) WHEN 0 THEN 'minority' ELSE 'non-minority' END
FROM @datasetitems;