Kavram, kabul edilen cevapla çok iyi açıklanmıştır, ancak bir insan ne kadar çok görürse, o kadar iyi battığını görüyorum. İşte artımlı bir örnek:
1) Patron diyor ki "stoklarımızda bulunan marka sayısını bana göre markalayın"
"Sorun değil" diyorsunuz
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Sonuç:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) Patron, "Şimdi bana markalarının VE ilgili markanın sahip olduğu parça sayısıyla tüm öğelerin bir listesini alın" diyor
Deneyebilirsiniz:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Ama şunu elde edersiniz:
ORA-00979: not a GROUP BY expression
İşte bu noktada OVER (PARTITION BY BRAND)
devreye giriyor:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Hangi anlama gelir?
COUNT(ITEM_ID)
- öğe sayısını al
OVER
- Satır kümesi üzerinde
(PARTITION BY BRAND)
- aynı markaya sahip
Ve sonuç:
+--------------+---------------+----------+
| 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 |
+--------------+---------------+----------+
vb...