在SQL中排列值
假设我有一个包含两列的表:在SQL中排列值,sql,oracle,permutation,Sql,Oracle,Permutation,假设我有一个包含两列的表: id | value ---------- 1 | 101 2 | 356 3 | 28 我需要随机排列value列,以便从现有集合{101356,28}中随机为每个id分配一个新值。如何在Oracle SQL中实现这一点 这听起来可能有点奇怪,但这是一个真正的问题,只是有更多的列。您可以通过使用带有随机数生成器的row\u number()来实现这一点,然后连接回原始行: with cte as ( select id, value,
id | value
----------
1 | 101
2 | 356
3 | 28
我需要随机排列value列,以便从现有集合{101356,28}中随机为每个id分配一个新值。如何在Oracle SQL中实现这一点
这听起来可能有点奇怪,但这是一个真正的问题,只是有更多的列。您可以通过使用带有随机数生成器的
row\u 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
s是从1开始的序列,并且没有间隙,您可以执行以下操作:
select row_number() over (order by dbms.random) as id, value
from table t;
一个选项:
select*from x_table,其中id=round(dbms_random.value()*3)+1代码>[这里3是随机数据表中的行数,我假设id是递增的且唯一的?]
我会考虑其他选项。我不确定这是否是SQL数据库的正确任务。也许您应该实现如下内容:
-在PL/SQL中,然后通过管道行
构造返回光标。对于大型数据集,按dbms.random排序可能会很慢