在 table 列 oracle 中混淆名称

Jumble up names in the table column oracle

我的要求是混淆 oracle table 中的名称以进行混淆,如下所示

规则

  1. 同一条记录不能重名
  2. 混音应该根据性别来进行
  3. 逻辑应该是完全随机的

Table 员工

ID Name Gender
1 Peter M
2 Pascal M
3 Robin M
4 Stephanie F
5 Arya F

Table 员工 -expcted

ID Name Gender
1 Robin M
2 Peter M
3 Pascal M
4 Arya F
5 Stephanie F

下面link提到了我到目前为止尝试过的方法,但不知何故我无法修复它,因为数据可能数以百万计 http://sqlfiddle.com/#!4/460bda/5

您可以使用 row_number():

随机分配每个性别的名字
select e.*, e2.name as new_name
from (select e.*,
             row_number() over (partition by gender order by name) as seqnum
      from employee e
     ) e join
     (select e.*,
             row_number() over (partition by gender order by dbms_random.random()) as seqnum
      from employee e
     ) e2
     on e.gender = e2.gender and e.seqnum = e2.seqnum;

这并不能保证名称永远不会被重复使用。事实上,考虑到其他限制,这是不可能的——一个性别可能只有一个名字。但是,这会随机分配名称,因此不太可能保持相同的名称。

如果您的名字可以重复,请使用 dense_rank() 而不是 row_number()

Here 是一个 db<>fiddle.

您可以使用“转移”方法避免将名称映射回相同的名称。然而,这种转变是可以撤销的。随机分配名称且重新分配的概率非常小的解决方案可能更适合混淆。