我需要从可归类为PHI的表中清除数据。
假设真实数据如下:
+-------------------+-----------+------+
| Name | Condition | Code |
+-------------------+-----------+------+
| Alex | A | 12 |
| Laura | BB | 32 |
| Bob | AAA | 55 |
| Gary | C | 32 |
+-------------------+-----------+------+
我需要使用以下假名替换名称列:
Names_Reference_Table:
+-------------+----+
| Name | ID |
+-------------+----+
| JOHN | 1 |
| ROBERT | 2 |
| MICHAEL | 3 |
| WILLIAM | 4 |
| DAVID | 5 |
| RICHARD | 6 |
| CHARLES | 7 |
| JOSEPH | 8 |
| THOMAS | 9 |
| CHRISTOPHER | 10 |
| DANIEL | 11 |
| PAUL | 12 |
| MARK | 13 |
| DONALD | 14 |
| GEORGE | 15 |
+-------------+----+
虽然我有10,000,000个真实数据记录,但我只有10,000个假数据记录。我假设在替换真实数据时,每个假名称将重复1000次。
这里的诀窍是,这需要可再加工。谷歌搜索了几个小时后,我确实找到了一些很好的资源,并且我已经创建了某种确定性的实现,假设种子没有改变:
SELECT FLOOR(RAND(@seed * LOG([p].[patientid]) * 1000) * ( @count_names - 1 ) + 1)
从上面可以看出,当您将相同的种子传递给RAND()时,它将返回相同的值。但是,这种实现很脆弱。
是否有人就如何产生这种确定性行为提供指导?
答案 0 :(得分:1)
您可以使用校验和或其他一些散列函数,例如
SELECT Name
FROM Names_Reference_Table
WHERE ID = ABS(CHECKSUM('John')) % 10000
假设您有10,000个假名
答案 1 :(得分:1)
如果我理解正确,实际名称不仅仅是虚拟名称。因此,您希望通过对实名重复虚拟名称1000来将实际名称替换为虚拟名称。这可以通过使用Ntile函数来实现,如下所示 -
declare @i int = (select max(id) from reference_table)
select b.name,a.condition,a.code from
(
select name,condition,code, Ntile(@i) over (order by code) as RefId
from actualTable
) as a
Left join Refrence_table as b
on b.id = a.refid
如果有帮助,请告诉我