Oracle агрегатная функция для возврата случайного значения для группы? - PullRequest
4 голосов
/ 18 июня 2010

Стандартная агрегатная функция SQL max() вернет самое высокое значение в группе; min() вернет самое низкое.

Существует ли в 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

очевидно, что последним столбцом является любое случайное значение в этой группе .

Ответы [ 2 ]

10 голосов
/ 18 июня 2010

Вы можете попробовать что-то вроде следующего:

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
/

Идея состоит в том, чтобы отсортировать значения в группе в случайном порядке и выбрать первый. Я могу придумать другие способы, но ни один из них не столь эффективен.

0 голосов
/ 26 мая 2014

Вы можете добавить случайную строку к столбцу, из которого вы хотите извлечь случайный элемент, а затем выбрать элемент 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)

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

...