我们说我有一个包含两列的表格:
id | value
----------
1 | 101
2 | 356
3 | 28
我需要随机置换值列,以便从现有集{101,356,28}中为每个id随机分配一个新值。我怎么能在Oracle SQL中做到这一点?
这可能听起来很奇怪,但这个 是一个真正的问题,只有更多的列。
答案 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排序可能会很慢。