Vấn đề:
Bạn muốn so sánh thứ hạng do RANK
tạo ra và DENSE_RANK
và thêm chúng dưới dạng cột mới vào bảng.
Ví dụ:
Cơ sở dữ liệu của chúng tôi có một bảng có tên sales_assistant
với dữ liệu trong các cột sau:id
(khóa chính), first_name
, last_name
, month
và sold products
.
id | first_name | last_name | tháng | sản phẩm đã bán |
---|---|---|---|---|
1 | Lisa | Đen | 5 | 2300 |
2 | Mary | Jacobs | 5 | 2400 |
3 | Lisa | Đen | 6 | 2700 |
4 | Mary | Jacobs | 6 | 2700 |
5 | Alex | Smith | 6 | 2900 |
6 | Mary | Jacobs | 7 | 1200 |
7 | Lisa | Đen | 7 | 1200 |
8 | Alex | Smith | 7 | 1000 |
Hãy hiển thị họ và tên của từng trợ lý bán hàng và số lượng sản phẩm đã bán. Chúng tôi cũng muốn xếp hạng chúng về số lượng sản phẩm được bán theo thứ tự giảm dần.
Giải pháp 1:
CHỌN RANK () HẾT (ĐẶT HÀNG THEO sản phẩm đã bán DESC) NHƯ r, DENSE_RANK () HẾT (ĐẶT HÀNG THEO sản phẩm đã bán DESC) NHƯ dr, first_name, last_name, tháng, sản phẩm đã bánFROM sales_assistant;
Truy vấn này trả về hai bảng xếp hạng:một bảng xếp hạng do RANK
tạo ra và một cái khác của DENSE_RANK
. Sự khác biệt là gì?
Nói một cách đơn giản, RANK
bỏ qua số vị trí sau các bản ghi có cùng số thứ hạng. Thứ hạng RANK_DENSE
trả về số vị trí từ 1 đến 6 vì nó không bỏ qua các bản ghi có cùng số thứ hạng:
r | dr | first_name | last_name | tháng | sản phẩm đã bán |
---|---|---|---|---|---|
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Đen | 6 | 2700 |
2 | 2 | Mary | Jacobs | 6 | 2700 |
4 | 3 | Mary | Jacobs | 5 | 2400 |
5 | 4 | Lisa | Đen | 5 | 2300 |
6 | 5 | Mary | Jacobs | 7 | 1200 |
6 | 5 | Lisa | Đen | 7 | 1200 |
8 | 6 | Alex | Smith | 7 | 1000 |
Thảo luận:
Nếu bạn muốn xếp hạng các hàng trong tập hợp kết quả, SQL cung cấp RANK()
và DENSE_RANK
chức năng. Các hàm này được sử dụng trong SELECT
với các cột khác. Sau khi RANK
hoặc DENSE_RANK
, chúng tôi gọi là OVER()
hàm này nhận ORDER BY
mệnh đề với tên của cột để sắp xếp trước khi chỉ định xếp hạng.
Không giống như DENSE_RANK
, RANK
bỏ qua các vị trí sau các thứ hạng bằng nhau. Số lượng vị trí bị bỏ qua phụ thuộc vào số lượng hàng có xếp hạng giống nhau. Ví dụ:Mary và Lisa đã bán cùng một số lượng sản phẩm và cả hai đều được xếp hạng # 2. Với RANK
, vị trí tiếp theo là # 4; với DENSE_RANK
, vị trí tiếp theo là # 3.
Cả RANK
và RANK_DENSE
làm việc trên các phân vùng dữ liệu:
Giải pháp 1:
SELECT RANK () OVER (PHẦN THEO ĐƠN HÀNG THEO tháng THEO sản phẩm đã bán MÔ TẢ) NHƯ r, DENSE_RANK () HẾT (PHẦN THỨ TỰ THEO tháng THEO sản phẩm đã bán DESC) NHƯ dr, first_name, last_name, tháng, sản phẩm đã bánFROM sales_assistant;Bạn có thể chia các bản ghi thành các nhóm theo một cột nhất định (trong ví dụ của chúng tôi là
month
). Trong trường hợp này, các bản ghi được xếp hạng như một phần của phân vùng:
r | dr | first_name | last_name | tháng | sản phẩm đã bán |
---|---|---|---|---|---|
1 | 1 | Mary | Jacobs | 5 | 2400 |
2 | 2 | Lisa | Đen | 5 | 2300 |
1 | 1 | Alex | Smith | 6 | 2900 |
2 | 2 | Lisa | Đen | 6 | 2700 |
2 | 2 | Mary | Jacobs | 6 | 2700 |
1 | 1 | Mary | Jacobs | 7 | 1200 |
1 | 1 | Lisa | Đen | 7 | 1200 |
3 | 2 | Alex | Smith | 7 | 1000 |