2010-06-18 130 views
4

標準SQL聚合函數max()將返回組中的最高值; min()將返回最低。Oracle聚合函數爲一個組返回一個隨機值?

在Oracle中是否有一個聚合函數來從組中返回一個隨機值?或者一些技術來實現這一目標?

例如,考慮到表foo

group_id value 
1  1 
1  5 
1  9 
2  2 
2  4 
2  8 

SQL查詢

select group_id, max(value), min(value), some_aggregate_random_func(value) 
from foo 
group by group_id; 

可能會產生:

group_id max(value), min(value), some_aggregate_random_func(value) 
1  9   1   1 
2  8   2   4 

用,很明顯,最後一列是任何隨機值在那組

+1

Gary,因爲我想要在[min,max]之間的圓頂隨機值,而不是中值。 – tpdi 2010-06-18 21:52:30

回答

10

你可以嘗試像下面

select deptno,max(sal),min(sal),max(rand_sal) 
from(
select deptno,sal,first_value(sal) 
    over(partition by deptno order by dbms_random.value) rand_sal 
from emp) 
group by deptno 
/

的想法是在隨機順序組內的值進行排序並挑選first.I可以想其他辦法,但沒有如此高效的東西。

+0

哇,我以爲「order by dbms_random.value」會被解釋爲列號。但測試表明這是有效的。謝謝。 – tpdi 2010-06-18 21:24:23

0

您可能會在要從中提取隨機元素的列中預先添加一個隨機字符串,然後選擇該列的min()元素並取出前置字符串。

select group_id, max(value), min(value), substr(min(random_value),11) 
from (select dbms_random.string('A', 10)||value random_value,foo.* from foo) 

這樣你C和避免使用聚合函數和,這可能會在這樣一個場景,你的查詢非常複雜/或你只是探索數據和手工查詢進入是有用的,指定兩次組隨着列和列的冗長和不斷變化的列表。

相關問題