2010-06-18 3 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

Гэри, потому что я хочу случайное значение купола между [мин, макс], а не медианным. – tpdi

ответ

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

Ничего себе, я бы подумал, что «порядок от dbms_random.value» будет интерпретироваться как номер столбца. Но тестирование показывает, что это работает. Благодарю. – tpdi

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) 

Таким образом, вы канд избежать с помощью агрегатной функции и задания в два раза группу,, что может быть полезным в случае, когда ваш запрос очень сложный/или вы просто исследуя данные и ручного ввода запросов с длинным и меняющимся списком групп по столбцам.

Смежные вопросы