我正在尝试为数据库综合生成一些种子值。我有一个员工列表,我希望将其中大约30%的员工归为“少数群体”,其余的归为“非少数群体”,我认为以下方法会起作用,但是将每个人都归为“少数群体”:
UPDATE datasetitems
SET minority = CASE WHEN (FLOOR(RAND()*(10-1+1)+1) > 3)
THEN 'Minority' ELSE 'Non-Minority' END;
答案 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;