Khái niệm này được giải thích rất tốt bởi câu trả lời được chấp nhận, nhưng tôi thấy rằng càng nhiều ví dụ, nó càng chìm sâu vào. Đây là một ví dụ gia tăng:
1) Ông chủ nói "hãy cho tôi số lượng vật phẩm chúng ta có trong kho được nhóm theo nhãn hiệu"
Bạn nói : "không vấn đề gì"
SELECT
BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Kết quả:
+--------------+---------------+
| Brand | Count |
+--------------+---------------+
| H&M | 50 |
+--------------+---------------+
| Hugo Boss | 100 |
+--------------+---------------+
| No brand | 22 |
+--------------+---------------+
2) Ông chủ nói "Bây giờ hãy cho tôi một danh sách tất cả các mặt hàng, với nhãn hiệu VÀ số lượng mặt hàng mà thương hiệu tương ứng có"
Bạn có thể thử:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID)
FROM
ITEMS
GROUP BY
BRAND;
Nhưng bạn nhận được:
ORA-00979: not a GROUP BY expression
Đây là nơi OVER (PARTITION BY BRAND)
xuất hiện:
SELECT
ITEM_NR
,BRAND
,COUNT(ITEM_ID) OVER (PARTITION BY BRAND)
FROM
ITEMS;
Có nghĩa là:
COUNT(ITEM_ID)
- lấy số lượng vật phẩm
OVER
- Trên tập hợp các hàng
(PARTITION BY BRAND)
- có cùng thương hiệu
Và kết quả là:
+--------------+---------------+----------+
| 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 |
+--------------+---------------+----------+
Vân vân...