Оракул "Раздел" Сайта

может кто-нибудь объяснить, что partition by ключевое слово делает и дает простой пример его в действии, а также почему его нужно использовать? У меня есть SQL-запрос, написанный кем-то другим, и я пытаюсь выяснить, что он делает.

пример раздела по:

SELECT empno, deptno, COUNT(*) 
OVER (PARTITION BY deptno) DEPT_COUNT
FROM emp

примеры, которые я видел в интернете, кажутся слишком глубокими.

5 ответов


на PARTITION BY пункт задает диапазон записей, которые будут использоваться для каждой группы "" в OVER предложения.

в вашем примере SQL, DEPT_COUNT возвращает количество сотрудников в этом отделе для каждой записи сотрудника. (Это как если бы ваш де-nomalising в 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) тогда вы можете подсчитать, сколько отделов в этом Государство.

это похоже на получение результатов GROUP BY (SUM, AVG, etc.) без агрегирования результирующего набора.

это полезно, когда вы используете LAST OVER или MIN OVER функции, чтобы получить, например, самую низкую и самую высокую зарплату в отделе, а затем использовать это в калькуляции против этой зарплаты записей без суб-выбор, который намного быстрее.

читать связанном статьи 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;

Whic означает:

  • 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