Menu
Coddy logo textTech

Funkcje RANK i DENSE_RANK

Lekcja 9 z 13 w kursie SQL dla zaawansowanych w Coddy.

ROW_NUMBER() to jeden typ funkcji rankingowej. Istnieją jeszcze dwie: RANK() i DENSE_RANK().

Funkcja RANK() numeruje wiersze tak jak ROW_NUMBER(), ale przypisuje takie same numery identycznym wierszom i pomija numery. DENSE_RANK() działa podobnie do RANK(), ale nie pomija numerów.

Na przykład:

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

Zwróci to:

idlevelrow_numrow_rankrow_dense_rank
15111
26222
36322
47443
57543
65664

ROW_NUMBER() przyjmuje unikalne wartości od 1 do 6, RANK() przypisuje te same wartości wierszom z tymi samymi poziomami, ale pomija 3 i 5, a DENSE_RANK() również przypisuje te same wartości wierszom z tymi samymi poziomami, ale nie pomija żadnych wartości.

challenge icon

Wyzwanie

Średni

Określone fikcyjne regiony otrzymują medale. Sukces regionu mierzy się łączną liczbą zdobytych medali oraz liczbą uzyskanych punktów.

Medal wanadowy oznacza 5 punktów

Srebrny medal oznacza 3 punkty

Brązowy medal oznacza 1 punkt

Oblicz wynik każdego regionu oraz łączną liczbę zdobytych przez niego medali i nazwij te kolumny odpowiednio total_score i total_medals. Uporządkuj kolumnę total_medals według rankingu gęstego i nazwij tę kolumnę final_rank.

Na koniec uporządkuj wynik według final_rank i region oraz 

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji SQL dla zaawansowanych

Poćwicz samodzielnie: Kompilator Python online