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

Bagaimana DENSE_RANK() Bekerja di SQL Server

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

Fungsi ini mirip dengan RANK() , tetapi tanpa celah dalam nilai peringkat yang dapat terjadi dengan RANK() ketika ikatan ada di set hasil.

Sintaks

Sintaksnya seperti ini:

DENSE_RANK ( ) OVER ( [  ] < order_by_clause > )

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

Dibutuhkan. Ini menentukan urutan di mana fungsi berlaku untuk baris dalam partisi.

Perhatikan bahwa OVER klausa biasanya menerima , tetapi argumen itu tidak dapat digunakan dengan fungsi ini.

Contoh 1 – Penggunaan Dasar

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

SELECT
  AlbumId,
  AlbumName,
  ArtistId,
  DENSE_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          | 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      |
+-----------+--------------------------+------------+--------+

Lihat ArtistId dan Peringkat kolom. Peringkat meningkat setiap kali ArtistId meningkat. Ini karena saya memesan oleh ArtistId, sehingga setiap artis baru akan mendapatkan peringkat baru.

Peringkat tetap sama untuk setiap artis, terlepas dari berapa banyak baris yang berisi ArtistId yang sama, karena hasilnya diurutkan berdasarkan kolom tersebut. Misalnya, lima baris berisi ArtistId yang sama dan oleh karena itu mereka juga berisi peringkat yang sama. Dengan kata lain, mereka semua terikat untuk peringkat 1.

Di banyak baris, peringkat kebetulan identik dengan ArtistId, tetapi ini hanya kebetulan. Kebetulan ArtistId adalah IDENTITY kolom yang dimulai dari 1 dan bertambah 1, yang juga merupakan RANK() melakukan. Namun, Anda akan melihat bahwa mereka tidak identik di semua baris. Misalnya, ArtistId melompat dari 7 ke 9, tetapi peringkatnya hanya naik dari 7 ke 8, dan sejak saat itu, kedua kolom berisi nilai yang berbeda.

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

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

Perhatikan bahwa hasil seri apa pun tidak akan memengaruhi peringkat berikutnya. Dengan kata lain, tidak akan ada kesenjangan dalam nilai peringkat.

Ini mungkin paling baik dijelaskan dengan sebuah contoh:

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

Dalam hal ini Lisa dan Bart imbang di nomor 1. Kemudian Burns masuk di nomor 2 (walaupun dia orang ketiga).

Jika Anda lebih suka bahwa Burns berada di peringkat nomor 3 dalam kasus ini (dan Meg di 4, dan seterusnya), gunakan RANK() fungsi sebagai gantinya.

Contoh 4 – Mengganti DENSE_RANK() dengan RANK()

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

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Menambahkan Batasan Kunci Asing ke Tabel yang Ada di SQL Server (T-SQL)

  2. Menghasilkan kode sql secara terprogram

  3. ROLLBACK TRUNCATE di SQL Server

  4. Cara Mengatur Spotlight Cloud dan Memecahkan Masalah SQL Server secara Efisien

  5. SET versus SELECT saat menetapkan variabel?