2015-06-30 111 views
0

在我的数据库中,每个ID都有多个记录。在我的输出中,我想按照DATE为每个ID对行进行排序,而ID最终随机显示。Oracle SQL按随机顺序排列

这是我的代码工作,但显示排序ID,不会导致随机编号:

SELECT ID, VALUE, DATE 
FROM TABLE 
ORDER BY ID, DATE DESC; 

我试图将其更改为

SELECT ID, VALUE, DATE 
FROM TABLE 
ORDER BY ID, dbms_random.value, DATE DESC; 

,但它没有工作,给了我这个错误:

ORA-01652: unable to extend temp segment by 64 in tablespace TEMP01 

我的猜测是我没有更多的磁盘分配给我的TEMP表空间,但如何修改它? 另外,我不确定我是否正确使用了dbms_random.value,是吗?


为了进一步说明我对展示随机ID的最后,请看下面的例子想法:

Origial:

ID VALUE DATE 
1  200  1/2/2013 
1  300  3/26/2013 
2  200  2/2/2013 
3  100  2/3/2015 
3  500  6/21/2014 
3  200  5/3/2014 

期望:

ID VALUE DATE 
2  200  2/2/2013 
3  200  5/3/2014 
3  500  6/21/2014 
3  100  2/3/2015 
1  200  1/2/2013 
1  300  3/26/2013 
+0

真实世界的TABLE表有多大? –

+0

我从我的原始数据中提取树列,其中有82,000,000行和50列 – datadatadata

+2

随机排序的商业目的是什么?这是可能的。但是在一张8200万行的桌子上这样做会非常昂贵。你是否真的确信商业目的证明了这种费用? –

回答

4

如果你想有一个随机抽样,使用sample条款或其他一些技术。如果近似数是足够的,那么你可以通过执行获得了1%的样本:

SELECT ID, VALUE, DATE 
FROM TABLE SAMPLE (1); 

另一种方法是:

SELECT ID, VALUE, DATE 
FROM TABLE 
WHERE dbms_random.value < 0.01; 

我不知道你想要什么类型的抽样(随机严,分层,整群抽样等)。但是,排序所有80,000,000行不应该是必需的。

+0

你是对的,排序所有80,000,000行真的没有必要。非常感谢 :) – datadatadata