Fungsi RANK & DENSE_RANK
Pelajaran 9 dari 13 dalam kursus SQL Tingkat Lanjut di Coddy.
ROW_NUMBER() adalah salah satu jenis fungsi pemeringkatan, dan ada dua lagi: RANK() dan DENSE_RANK().
Fungsi RANK() memberi nomor pada baris seperti ROW_NUMBER(), tetapi memberikan nomor yang sama untuk baris dengan nilai yang sama dan melewatkan nomor. DENSE_RANK() mirip dengan RANK(), tetapi tidak melewatkan nomor.
Contohnya:
| id | level |
| 1 | 5 |
| 2 | 6 |
| 3 | 6 |
| 4 | 7 |
| 5 | 7 |
| 6 | 5 |
SELECT id,
ROW_NUMBER() OVER (ORDER BY level) as row_num,
RANK() OVER (ORDER BY level) as row_rank,
DENSE_RANK() OVER (ORDER BY level) as row_dense_rank,
FROM table1Hasilnya:
| id | level | row_num | row_rank | row_dense_rank |
| 1 | 5 | 1 | 1 | 1 |
| 2 | 6 | 2 | 2 | 2 |
| 3 | 6 | 3 | 2 | 2 |
| 4 | 7 | 4 | 4 | 3 |
| 5 | 7 | 5 | 4 | 3 |
| 6 | 5 | 6 | 6 | 4 |
ROW_NUMBER() memberi nomor dari 1 hingga 6 dengan nilai yang unik. RANK() memberikan nilai yang sama untuk level yang sama, tetapi melewatkan 3 dan 5. DENSE_RANK() juga memberikan nilai yang sama untuk level yang sama, tetapi tidak melewatkan nilai apa pun.
Tantangan
SedangWilayah imajiner tertentu menerima medali. Keberhasilan suatu wilayah diukur dari jumlah total medali yang mereka miliki dan jumlah skor yang mereka peroleh.
Medali vanadium bernilai 5 skor
Medali perak bernilai 3 skor
Medali perunggu bernilai 1 skor
Hitung skor setiap wilayah dan jumlah total medali yang mereka miliki, lalu beri nama kolom tersebut total_score dan total_medals secara berurutan. Beri peringkat padat pada kolom total_medals dan beri nama kolom ini final_rank.
Terakhir, urutkan hasil berdasarkan final_rank dan region dan
Coba sendiri
WITH region_total_medals AS (
SELECT region, SUM(medal_count) as total_medals
FROM medals
GROUP BY region
), region_prepare_total_score AS (
SELECT region, medal_color, medal_count, DENSE_RANK() OVER (ORDER BY medal_color) as medal_rank
FROM medals
), region_total_score AS (
SELECT region, SUM((medal_rank*2 - 1)*medal_count) as medal_rank
FROM region_prepare_total_score
GROUP BY region
)
SELECT region_total_medals.region,
total_medals, medal_rank,
DENSE_RANK() OVER (ORDER BY total_medals) as final_rank
FROM region_total_score
JOIN region_total_medals ON region_total_medals.region = region_total_score.regionSemua pelajaran di SQL Tingkat Lanjut
Latihan sendiri: Compiler Python online