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:
| 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 table1Zwróci to:
| 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() 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.
Wyzwanie
ŚredniOkreś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.regionWszystkie lekcje w sekcji SQL dla zaawansowanych
Poćwicz samodzielnie: Kompilator Python online