【发布时间】:2015-06-27 21:45:55
【问题描述】:
我正在构建我的第一个去识别化脚本,但我的方法遇到了问题。
我有一个表 dbo.pseudonyms,其 firstname 列填充了 200 行数据。此列 200 行中的每一行都有一个值(没有一个为空)。此表还有一个 id 列(int,主键,非空),数字为 1-200。
我想要做的是,在一个语句中,用从我的pseudonyms 表中为每一行随机选择的firstname 数据重新填充我的整个USERS 表。
要生成用于挑选的随机数,我使用ABS(Checksum(NewId())) % 200。每次我做SELECT ABS(Checksum(NewId())) % 200 时,我都会得到一个在我正在寻找的范围内的数值,没有间歇性不稳定的行为。
但是,当我在以下语句中使用此公式时:
SELECT pn.firstname
FROM DeIdentificationData.dbo.pseudonyms pn
WHERE pn.id = ABS(Checksum(NewId())) % 200
我得到非常断断续续的结果。我会说大约 30% 的结果返回一个从表中挑选出来的名字(这是预期的结果),大约 30% 的返回多个结果(令人费解,有没有重复的 id 列值),大约 30% 的返回值为 NULL(即使 firstname 列中有 no 个空行)
我确实为这个特定问题寻找了很长一段时间,但到目前为止无济于事。我假设这个问题与使用这个公式作为指针有关,但我不知道如何做到这一点。
想法?
【问题讨论】:
-
使用适当的软件(MySQL、Oracle、DB2...)和版本标记数据库问题很有帮助,例如
sql-server-2014。语法和功能的差异通常会影响答案。如果您使用的是 SQL Server,您可能需要考虑CRYPT_GEN_RANDOM。 Example. -
更新了标签,谢谢!
-
ABS(Checksum(NewId()))按行重新评估。你可能想要rand,但不是。 -
我喜欢 crypt_gen_random,很好找。但是我不确定如何将我的随机数范围限制在 1 - 200 之间?
-
Martin 我想要得到的是一个新的随机值,用于我拉取并更新我的 USER 表的每一行。如果没有对每行重新评估公式,这是否意味着我会为每一行设置相同的值?
标签: sql sql-server tsql random sql-server-2008-r2