Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Sự khác biệt giữa RANK và DENSE_RANK trong SQL là gì?

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 , monthsold 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()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ả RANKRANK_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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách cài đặt Kubernetes bằng Kubeadm

  2. Mười mối đe dọa phổ biến đối với chất lượng kế hoạch thực thi

  3. Thông báo về tính khả dụng chung của SQL Safe Backup 8.7.2

  4. T-SQL Thứ ba # 33:Cú đánh lừa:Lược đồ Switch-A-Roo

  5. Chuyển đổi ngầm bên cột đắt như thế nào?