Концепция очень хорошо объясняется принятым ответом, но я обнаружил, что чем больше примеров увидишь, тем лучше они будут погружены. Вот дополнительный пример:
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 |
+--------------+---------------+----------+
и т.д...