Группировка по разделу в Oracle - PullRequest
8 голосов
/ 27 июля 2011

Я пишу запрос для извлечения записей из хранилища Oracle. Это простой запрос выбора с объединениями нескольких таблиц, и у меня есть несколько столбцов для агрегирования. Следовательно я заканчиваю тем, что использовал Groupby на остальных столбцах.

Скажем, я выбираю около 10 столбцов, из которых 5 - совокупные столбцы. поэтому мне нужно сгруппировать по другим 5 столбцам. Я даже могу достичь того же, не используя Groupby и используя предложение over (paritition by) для каждого столбца каждого агрегата, который я хочу получить.

Я не уверен, что лучше против склада или вообще.

Ответы [ 3 ]

20 голосов
/ 27 июля 2011

Они не одинаковы.

Это вернет 3 строки:

select deptno, count(*) c from emp group by deptno;

DEPTNO C
------ -
10     3
20     5
30     6

Это вернет 14:

select deptno, count(*) over (partition by deptno) c from emp;


DEPTNO C
------ -
10     3
10     3
10     3
20     5
20     5
20     5
20     5
20     5
30     6
30     6
30     6
30     6
30     6
30     6
6 голосов
/ 02 октября 2012

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

0 голосов
/ 28 октября 2016

С PARTITON BY возможно сделать это в одном запросе, чтобы получить другие вычисления или сгруппировать по.

select
     DISTINCT deptno, count(*) over (partition by deptno) c,
     COUNT(*) OVER (PARTITION BY NULL) AS TOTAL
from emp;
...