Menu
CoddyTech

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:

idlevel
15
26
36
47
57
65
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 table1

Hasilnya:

idlevelrow_numrow_rankrow_dense_rank
15111
26222
36322
47443
57543
65664

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.

challenge icon

Tantangan

Sedang

Wilayah 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.region

Semua pelajaran di SQL Tingkat Lanjut

Latihan sendiri: Compiler Python online