Oracle" Partition By " Ключевое Слово
может кто-нибудь объяснить, что такое partition by
ключевое слово делает и дает простой пример его в действии, а также почему его нужно использовать? У меня есть SQL-запрос, написанный кем-то другим, и я пытаюсь выяснить, что он делает.
пример разбиения на:
SELECT empno, deptno, COUNT(*)
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp
примеры, которые я видел в интернете, кажутся слишком глубокими.
5 ответов:
The
PARTITION BY
пункт задает диапазон записей, которые будут использоваться для каждой группы "" вOVER
предложения.в вашем примере SQL,
DEPT_COUNT
возвращает количество сотрудников в этом отделе для каждой записи сотрудника. (Это как если бы ваша де-номализацияemp
таблица; вы все еще возвращаете каждую запись вemp
таблица.)emp_no dept_no DEPT_COUNT 1 10 3 2 10 3 3 10 3 <- three because there are three "dept_no = 10" records 4 20 2 5 20 2 <- two because there are two "dept_no = 20" records
если бы был другой столбец (например,
state
) тогда вы могли бы посчитать, сколько отделов в этом Государство.это похоже на получение результатов a
GROUP BY
(SUM
,AVG
и т. д.) без агрегации результирующего набора.это полезно, когда вы используете
LAST OVER
илиMIN OVER
функции, чтобы получить, например, самую низкую и самую высокую зарплату в отделе, а затем использовать это в калькуляции против этой зарплаты записей без a sub select, что намного быстрее.читать по ссылке статьи AskTom для дальнейшего подробности.
концепция очень хорошо объясняется принятым ответом, но я считаю, что чем больше примеров вы видите, тем лучше он погружается. Вот инкрементный пример:
1) босс "получите мне количество предметов, которые у нас есть на складе, сгруппированных по бренду"
скажете вы: "без проблем"
SELECT BRAND ,COUNT(ITEM_ID) FROM ITEMS GROUP BY BRAND;
результат:
+--------------+---------------+ | Brand | Count | +--------------+---------------+ | H&M | 50 | +--------------+---------------+ | Hugo Boss | 100 | +--------------+---------------+ | No brand | 22 | +--------------+---------------+
2) босс говорит " теперь дайте мне список всех предметов, с их брендом и номером из предметов, которые имеют этот бренд"
можно попробовать:
SELECT ITEM_NR ,BRAND ,COUNT(ITEM_ID) FROM ITEMS GROUP BY BRAND;
но вы получаете:
ORA-00979: not a GROUP BY expression
вот тут
OVER (PARTITION BY BRAND)
поставляется в:SELECT ITEM_NR ,BRAND ,COUNT(ITEM_ID) OVER (PARTITION BY BRAND) FROM ITEMS;
который означает:
COUNT(ITEM_ID)
- узнать количество элементовOVER
- над набором строк(PARTITION BY BRAND)
- которые имеют тот же брендв результате:
+--------------+---------------+----------+ | Items | Brand | Count() | +--------------+---------------+----------+ | Item 1 | Hugo Boss | 100 | +--------------+---------------+----------+ | Item 2 | Hugo Boss | 100 | +--------------+---------------+----------+ | Item 3 | No brand | 22 | +--------------+---------------+----------+ | Item 4 | No brand | 22 | +--------------+---------------+----------+ | Item 5 | H&M | 50 | +--------------+---------------+----------+
etc...
Это расширение SQL называется analytics. "Over" в инструкции select сообщает oracle, что функция является аналитической функцией, а не функцией group by. Преимущество использования аналитики заключается в том, что вы можете собирать суммы, подсчеты и многое другое только с одним проходом через данные вместо циклического перебора данных с помощью sub selects или, что еще хуже, PL/SQL.
Это выглядит запутанным на первый взгляд, но это будет вторая натура быстро. Никто не объясняет это лучше, чем Том Кайт. Так что ссылка выше велика.
конечно, чтение документация является обязательным.
EMPNO DEPTNO DEPT_COUNT
7839 10 4 5555 10 4 7934 10 4 7782 10 4 --- 4 records in table for dept 10 7902 20 4 7566 20 4 7876 20 4 7369 20 4 --- 4 records in table for dept 20 7900 30 6 7844 30 6 7654 30 6 7521 30 6 7499 30 6 7698 30 6 --- 6 records in table for dept 30
здесь мы получаем подсчет для соответствующего deptno. Что касается deptno 10, то у нас есть 4 записи в таблице emp аналогичные результаты для deptno 20 и 30.
ключевое слово over partition-это как если бы мы разделяли данные по client_id создание подмножества каждого идентификатора клиента
select client_id, operation_date, row_number() count(*) over (partition by client_id order by client_id ) as operationctrbyclient from client_operations e order by e.client_id;
этот запрос вернет количество операций в client_id