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

Cách DENSE_RANK () hoạt động trong SQL Server

Trong SQL Server, DENSE_RANK() hàm trả về thứ hạng của mỗi hàng trong phân vùng của tập kết quả. Thứ hạng của một hàng là một cộng với số thứ hạng riêng biệt đứng trước hàng.

Hàm này tương tự như RANK() , nhưng không có khoảng trống trong các giá trị xếp hạng có thể xảy ra với RANK() khi các mối quan hệ tồn tại trong tập kết quả.

Cú pháp

Cú pháp như sau:

DENSE_RANK ( ) OVER ( [  ] < order_by_clause > )

Là tùy chọn. Nó chia tập hợp kết quả được tạo ra bởi FROM mệnh đề thành các phân vùng mà hàm được áp dụng. Nếu không được chỉ định, tất cả các hàng của tập kết quả truy vấn được coi là một nhóm duy nhất.

bắt buộc. Nó xác định thứ tự mà hàm áp dụng cho các hàng trong một phân vùng.

Lưu ý rằng OVER mệnh đề thường chấp nhận , nhưng không thể sử dụng đối số đó với hàm này.

Ví dụ 1 - Cách sử dụng cơ bản

Dưới đây là một ví dụ cơ bản cho thấy việc sử dụng DENSE_RANK() chức năng:

SELECT
  AlbumId,
  AlbumName,
  ArtistId,
  DENSE_RANK() OVER (ORDER BY ArtistId ASC) 'Rank'
FROM Albums;

Kết quả:

+-----------+--------------------------+------------+--------+
| AlbumId   | AlbumName                | ArtistId   | Rank   |
|-----------+--------------------------+------------+--------|
| 1         | Powerslave               | 1          | 1      |
| 7         | Somewhere in Time        | 1          | 1      |
| 8         | Piece of Mind            | 1          | 1      |
| 9         | Killers                  | 1          | 1      |
| 10        | No Prayer for the Dying  | 1          | 1      |
| 2         | Powerage                 | 2          | 2      |
| 19        | All Night Wrong          | 3          | 3      |
| 20        | The Sixteen Men of Tain  | 3          | 3      |
| 12        | Big Swing Face           | 4          | 4      |
| 4         | Ziltoid the Omniscient   | 5          | 5      |
| 5         | Casualties of Cool       | 5          | 5      |
| 6         | Epicloud                 | 5          | 5      |
| 3         | Singing Down the Lane    | 6          | 6      |
| 16        | Long Lost Suitcase       | 7          | 7      |
| 17        | Praise and Blame         | 7          | 7      |
| 18        | Along Came Jones         | 7          | 7      |
| 11        | No Sound Without Silence | 9          | 8      |
| 21        | Yo Wassup                | 9          | 8      |
| 22        | Busted                   | 9          | 8      |
| 13        | Blue Night               | 12         | 9      |
| 14        | Eternity                 | 12         | 9      |
| 15        | Scandinavia              | 12         | 9      |
+-----------+--------------------------+------------+--------+

Nhìn vào ArtistId Xếp hạng cột. Thứ hạng tăng lên mỗi khi ArtistId tăng. Điều này là do tôi đang đặt hàng theo ArtistId và vì vậy mỗi nghệ sĩ mới sẽ nhận được một thứ hạng mới.

Thứ hạng được giữ nguyên với mỗi nghệ sĩ, bất kể có bao nhiêu hàng chứa cùng một ArtistId, vì kết quả được sắp xếp theo cột đó. Ví dụ:năm hàng chứa cùng một ArtistId và do đó chúng cũng chứa cùng một thứ hạng. Nói cách khác, tất cả đều được xếp hạng 1.

Trong nhiều hàng, thứ hạng giống hệt với ArtistId, nhưng đây chỉ là sự trùng hợp ngẫu nhiên. Điều xảy ra là ArtistId là IDENTITY cột bắt đầu từ 1 và tăng dần 1, đây cũng là cột RANK() làm. Tuy nhiên, bạn sẽ thấy rằng chúng không giống nhau trên tất cả các hàng. Ví dụ:ArtistId bỏ qua từ 7 đến 9, nhưng xếp hạng chỉ tăng từ 7 lên 8 và từ đó trở đi, cả hai cột đều chứa các giá trị khác nhau.

Ví dụ 2 - Phân vùng

Bạn cũng có thể chia kết quả thành các phân vùng. Khi bạn làm điều này, thứ hạng được tính dựa trên mỗi phân vùng (vì vậy nó sẽ bắt đầu lại với mỗi phân vùng mới).

Ví dụ:

SELECT
  Genre,
  AlbumName,
  ArtistId,
  DENSE_RANK() OVER (PARTITION BY Genre ORDER BY ArtistId ASC) 'Rank'
FROM Albums
INNER JOIN Genres 
ON Albums.GenreId = Genres.GenreId;

Kết quả:

+---------+--------------------------+------------+--------+
| Genre   | AlbumName                | ArtistId   | Rank   |
|---------+--------------------------+------------+--------|
| Country | Singing Down the Lane    | 6          | 1      |
| Country | Yo Wassup                | 9          | 2      |
| Country | Busted                   | 9          | 2      |
| Jazz    | All Night Wrong          | 3          | 1      |
| Jazz    | The Sixteen Men of Tain  | 3          | 1      |
| Jazz    | Big Swing Face           | 4          | 2      |
| Pop     | Long Lost Suitcase       | 7          | 1      |
| Pop     | Praise and Blame         | 7          | 1      |
| Pop     | Along Came Jones         | 7          | 1      |
| Pop     | No Sound Without Silence | 9          | 2      |
| Pop     | Blue Night               | 12         | 3      |
| Pop     | Eternity                 | 12         | 3      |
| Pop     | Scandinavia              | 12         | 3      |
| Rock    | Powerslave               | 1          | 1      |
| Rock    | Somewhere in Time        | 1          | 1      |
| Rock    | Piece of Mind            | 1          | 1      |
| Rock    | Killers                  | 1          | 1      |
| Rock    | No Prayer for the Dying  | 1          | 1      |
| Rock    | Powerage                 | 2          | 2      |
| Rock    | Ziltoid the Omniscient   | 5          | 3      |
| Rock    | Casualties of Cool       | 5          | 3      |
| Rock    | Epicloud                 | 5          | 3      |
+---------+--------------------------+------------+--------+

Trong trường hợp này, tôi phân vùng theo Thể loại. Điều này khiến mỗi hàng chỉ được xếp hạng so với các hàng khác trong cùng một phân vùng. Vì vậy, mỗi phân vùng làm cho giá trị xếp hạng bắt đầu lại từ 1.

Ví dụ 3 - Ví dụ về Bảng điểm

Đây là một trường hợp sử dụng khả thi để hiển thị thứ hạng cho người dùng.

SELECT  
  Player,
  Score,
  DENSE_RANK() OVER (ORDER BY Score Desc) 'Rank'
FROM Scoreboard;

Kết quả:

+----------+---------+--------+
| Player   | Score   | Rank   |
|----------+---------+--------|
| Bart     | 2010    | 1      |
| Burns    | 1270    | 2      |
| Meg      | 1030    | 3      |
| Marge    | 990     | 4      |
| Lisa     | 710     | 5      |
| Ned      | 666     | 6      |
| Apu      | 350     | 7      |
| Homer    | 1       | 8      |
+----------+---------+--------+

Hãy lưu ý rằng bất kỳ kết quả ràng buộc nào sẽ không ảnh hưởng đến các thứ hạng tiếp theo. Nói cách khác, sẽ không có khoảng cách trong giá trị xếp hạng.

Điều này có lẽ được giải thích tốt nhất bằng một ví dụ:

SELECT  
  Player,
  Score,
  DENSE_RANK() OVER (ORDER BY Score Desc) 'Rank'
FROM Scoreboard;

Kết quả:

+----------+---------+--------+
| Player   | Score   | Rank   |
|----------+---------+--------|
| Lisa     | 2010    | 1      |
| Bart     | 2010    | 1      |
| Burns    | 1270    | 2      |
| Meg      | 1030    | 3      |
| Marge    | 990     | 4      |
| Ned      | 666     | 5      |
| Apu      | 350     | 6      |
| Homer    | 1       | 7      |
+----------+---------+--------+

Trong trường hợp này, Lisa và Bart được xếp ở vị trí số 1. Sau đó, Burns đứng ở vị trí thứ 2 (mặc dù anh ấy là người thứ ba).

Nếu bạn muốn Burns được xếp hạng 3 trong trường hợp này (và Meg là 4, v.v.), hãy sử dụng RANK() chức năng thay thế.

Ví dụ 4 - Thay thế DENSE_RANK () bằng RANK ()

Đây là ví dụ tương tự một lần nữa, ngoại trừ lần này tôi sử dụng RANK() :

SELECT  
  Player,
  Score,
  RANK() OVER (ORDER BY Score Desc) 'Rank'
FROM Scoreboard;

Kết quả:

+----------+---------+--------+
| Player   | Score   | Rank   |
|----------+---------+--------|
| Lisa     | 2010    | 1      |
| Bart     | 2010    | 1      |
| Burns    | 1270    | 3      |
| Meg      | 1030    | 4      |
| Marge    | 990     | 5      |
| Ned      | 666     | 6      |
| Apu      | 350     | 7      |
| Homer    | 1       | 8      |
+----------+---------+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Giám sát bộ đếm hiệu suất qua PERFMON | Khắc phục sự cố hiệu suất máy chủ SQL -3

  2. Cài đặt cụm chuyển đổi dự phòng SQL Server -2

  3. Kết nối SQL Server với cơ sở dữ liệu Java

  4. Giúp hiệu suất SQL Server dễ dàng

  5. UNIX_TIMESTAMP trong SQL Server