Koncepcja jest bardzo dobrze wyjaśniona przez przyjętą odpowiedź, ale uważam, że im więcej widzisz, tym lepiej się w nim zatapia. Oto przykład przyrostowy:
1) Szef mówi „zdobądź dla mnie liczbę artykułów w magazynie pogrupowanych według marki”
Mówisz : „bez problemu”
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Wynik:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) Szef mówi „Teraz podaj mi listę wszystkich produktów, wraz z ich marką ORAZ liczbą przedmiotów, które posiada dana marka”
Możesz spróbować:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Ale dostajesz:
ORA-00979: not a GROUP BY expression
Oto, co OVER (PARTITION BY BRAND)
przychodzi:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Które oznacza:
COUNT(ITEM_ID)
- uzyskać liczbę przedmiotów
OVER
- Nad zestawem rzędów
(PARTITION BY BRAND)
- które mają tę samą markę
Rezultat to:
+--------------+---------------+----------+
| 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 |
+--------------+---------------+----------+
itp...