Oracle" Partition By " Ключевое Слово


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

пример разбиения на:

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

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

5 204

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