O conceito é muito bem explicado pela resposta aceita, mas acho que quanto mais exemplo se vê, melhor ele se encaixa. Aqui está um exemplo incremental:
1) O chefe diz "obtenha-me o número de itens que temos em estoque, agrupados por marca"
Você diz : "não há problema"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Resultado:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) O chefe diz "Agora, consiga uma lista de todos os itens, com a marca E o número de itens que a respectiva marca possui"
Você pode tentar:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Mas você obtém:
ORA-00979: not a GROUP BY expression
É aqui que OVER (PARTITION BY BRAND)
entra:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
O que significa:
COUNT(ITEM_ID)
- obtenha o número de itens
OVER
- Sobre o conjunto de linhas
(PARTITION BY BRAND)
- que tenham a mesma marca
E o resultado é:
+--------------+---------------+----------+
| 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 ...