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 > )
FROM
klausa ke dalam partisi tempat fungsi diterapkan. Jika tidak ditentukan, semua baris kumpulan hasil kueri diperlakukan sebagai satu grup.
Perhatikan bahwa OVER
klausa biasanya menerima
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 | +----------+---------+--------+