Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Bagaimana RANK() Bekerja di SQL Server

Di SQL Server, RANK() fungsi mengembalikan peringkat setiap baris dalam partisi dari kumpulan hasil. Pangkat suatu baris adalah satu ditambah jumlah pangkat yang datang sebelum baris tersebut.

Sintaks

Sintaksnya seperti ini:

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

partition_by_clause adalah opsional. Ini membagi set hasil yang dihasilkan oleh FROM klausa ke dalam partisi tempat fungsi diterapkan. Jika tidak ditentukan, fungsi akan memperlakukan semua baris dari kumpulan hasil kueri sebagai satu grup.

order_by_clause Dibutuhkan. Ini menentukan urutan data sebelum fungsi diterapkan.

Perhatikan bahwa OVER klausa biasanya menerima rows_or_range_clause , tetapi argumen itu tidak dapat digunakan dengan RANK() fungsi.

Contoh 1 – Penggunaan Dasar

Berikut adalah contoh dasar yang menunjukkan penggunaan RANK() fungsi:

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

Hasil:

+-----------+--------------------------+------------+--------+
| 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          | 6      |
| 19        | All Night Wrong          | 3          | 7      |
| 20        | The Sixteen Men of Tain  | 3          | 7      |
| 12        | Big Swing Face           | 4          | 9      |
| 4         | Ziltoid the Omniscient   | 5          | 10     |
| 5         | Casualties of Cool       | 5          | 10     |
| 6         | Epicloud                 | 5          | 10     |
| 3         | Singing Down the Lane    | 6          | 13     |
| 16        | Long Lost Suitcase       | 7          | 14     |
| 17        | Praise and Blame         | 7          | 14     |
| 18        | Along Came Jones         | 7          | 14     |
| 11        | No Sound Without Silence | 9          | 17     |
| 21        | Yo Wassup                | 9          | 17     |
| 22        | Busted                   | 9          | 17     |
| 13        | Blue Night               | 12         | 20     |
| 14        | Eternity                 | 12         | 20     |
| 15        | Scandinavia              | 12         | 20     |
+-----------+--------------------------+------------+--------+

Fokus utama kami adalah ArtistId dan Peringkat kolom. Kita dapat melihat bahwa peringkat meningkat setiap kali ArtistId meningkat. Ini karena saya memesan oleh ArtistId, sehingga setiap artis baru akan mendapatkan peringkat baru.

Saat kita melihat Peringkat kolom, kita bisa melihat beberapa ikatan. Artinya, beberapa baris berbagi peringkat yang sama. Ini sudah diduga, karena saya memesan berdasarkan ArtistId dan beberapa nilai ArtistId ada di lebih dari satu baris.

Baris terikat ini bagus untuk mendemonstrasikan bagaimana RANK() bekerja. Seperti yang disebutkan, itu bertambah satu ditambah jumlah peringkat yang datang sebelumnya. Baris yang diikat menyebabkan celah muncul di nilai peringkat (yaitu tidak selalu bertambah 1). Dalam contoh di atas, ada beberapa celah. Yang pertama adalah dari 1 ke 6. Kemudian yang lain dari 7 ke 9, dan seterusnya.

Jika Anda tidak menginginkan celah ini, gunakan DENSE_RANK() , yang bekerja dengan cara yang sama kecuali tanpa celah. Peringkat padat dihitung sebagai satu ditambah jumlah berbeda nilai peringkat yang datang sebelum baris itu.

Contoh 2 – Partisi

Anda juga dapat membagi hasilnya menjadi beberapa partisi. Ketika Anda melakukan ini, peringkat dihitung terhadap setiap partisi (jadi dimulai lagi dengan setiap partisi baru).

Contoh:

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

Hasil:

+---------+--------------------------+------------+--------+
| 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          | 3      |
| Pop     | Long Lost Suitcase       | 7          | 1      |
| Pop     | Praise and Blame         | 7          | 1      |
| Pop     | Along Came Jones         | 7          | 1      |
| Pop     | No Sound Without Silence | 9          | 4      |
| Pop     | Blue Night               | 12         | 5      |
| Pop     | Eternity                 | 12         | 5      |
| Pop     | Scandinavia              | 12         | 5      |
| 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          | 6      |
| Rock    | Ziltoid the Omniscient   | 5          | 7      |
| Rock    | Casualties of Cool       | 5          | 7      |
| Rock    | Epicloud                 | 5          | 7      |
+---------+--------------------------+------------+--------+

Dalam hal ini saya mempartisi berdasarkan Genre. Ini menyebabkan setiap baris hanya diperingkatkan terhadap baris lain di partisi yang sama. Jadi setiap partisi menyebabkan nilai peringkat mulai dari 1 lagi.

Contoh 3 – Contoh Papan Skor

Berikut adalah kemungkinan kasus penggunaan untuk menampilkan peringkat kepada pengguna.

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

Hasil:

+----------+---------+--------+
| 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      |
+----------+---------+--------+

Namun, perhatikan bahwa setiap hasil yang terikat akan menghasilkan kesenjangan dalam nilai peringkat.

Inilah yang terjadi jika Lisa tiba-tiba menyamai skor Bart:

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

Hasil:

+----------+---------+--------+
| 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      |
+----------+---------+--------+

Dalam hal ini tidak ada yang menempati peringkat 2, karena dua pemain pertama terikat di peringkat 1.

Seperti yang disebutkan, jika Anda perlu menghilangkan celah seperti ini, gunakan DENSE_RANK() .

Contoh 4 – Mengganti RANK() dengan DENSE_RANK()

Ini contoh yang sama lagi, kecuali kali ini saya menggunakan DENSE_RANK() :

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

Hasil:

+----------+---------+--------+
| 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      |
+----------+---------+--------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menghubungkan SQL Server ke Database Java

  2. Cara Membulatkan (ATAS/BAWAH) di SQL Server – 5 Tips Berguna

  3. Bagaimana cara membuat batasan unik yang juga memungkinkan nol?

  4. Mengapa Alat Pemantauan Database Cloud untuk SQL Server Berharga

  5. Menulis file csv ke database SQL Server menggunakan python