在SQL中置换值

时间:2014-08-19 12:29:26

标签: sql oracle permutation

我们说我有一个包含两列的表格:

id | value
----------
 1 | 101
 2 | 356
 3 |  28

我需要随机置换值列,以便从现有集{101,356,28}中为每个id随机分配一个新值。我怎么能在Oracle SQL中做到这一点?

这可能听起来很奇怪,但这个 是一个真正的问题,只有更多的列。

3 个答案:

答案 0 :(得分:3)

您可以使用随机数生成器row_number()然后加入原始行来执行此操作:

with cte as (
      select id, value,
             row_number() over (order by id) as i,
             row_number() over (order by dbms_random.random) as rand_i
      from table t
     )
select cte.id, cte1.value
from cte join
     cte cte1
     on cte.i = cte.rand_i;

这保证了排列(即没有原始行的值使用两次)。

编辑:

顺便说一句,如果原始的id是从1顺序并且没有间隙,那么你可以这样做:

select row_number() over (order by dbms.random) as id, value
from table t;

答案 1 :(得分:0)

选项:select * from x_table where id = round(dbms_random.value() * 3) + 1; [这里3是随机数据表中的行数,我假设id是增量且唯一的?]

我会想到其他选择。

答案 2 :(得分:0)

我不确定这是否是SQL数据库的正确任务。也许你应该实现这样的东西:

Factoradic permutation - 在PL / SQL中,然后通过PIPE ROW构造返回一个游标。对于大型数据集,按dbms.random排序可能会很慢。