El concepto está muy bien explicado por la respuesta aceptada, pero creo que cuanto más ejemplo se ve, mejor se asimila. Aquí hay un ejemplo incremental:
1) El jefe dice "dame la cantidad de artículos que tenemos en stock agrupados por marca"
Usted dice : "no hay problema"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Resultado:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) El jefe dice "Ahora consígueme una lista de todos los artículos, con su marca Y la cantidad de artículos que tiene la marca respectiva"
Puedes probar:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Pero obtienes:
ORA-00979: not a GROUP BY expression
Aquí es donde OVER (PARTITION BY BRAND)
entra el:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
¿Qué significa:
COUNT(ITEM_ID)
- obtener el número de artículos
OVER
- Sobre el conjunto de filas
(PARTITION BY BRAND)
- que tienen la misma marca
Y el resultado es:
+--------------+---------------+----------+
| 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 ...