Menu
CoddyTech

Hàm RANK và DENSE_RANK

Bài học 9 trên 13 trong khóa học SQL nâng cao của Coddy.

ROW_NUMBER() là một loại hàm xếp hạng, còn có hai loại nữa: RANK() và DENSE_RANK().

Hàm RANK() đánh số các hàng như ROW_NUMBER(), nhưng gán cùng một số cho các hàng có cùng giá trị và bỏ qua số. DENSE_RANK() tương tự RANK(), nhưng không bỏ qua số.

Ví dụ:

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

Kết quả trả về:

idlevelrow_numrow_rankrow_dense_rank
15111
26222
36322
47443
57543
65664

ROW_NUMBER() tăng từ 1 đến 6 với các giá trị duy nhất. RANK() trả về cùng giá trị cho các hàng có cùng mức, nhưng bỏ qua 3 và 5. DENSE_RANK() cũng trả về cùng giá trị cho các hàng có cùng mức, nhưng không bỏ qua giá trị nào.

challenge icon

Thử thách

Trung bình

Một số vùng giả tưởng nhận được huy chương. Thành tích của một vùng được đo bằng tổng số huy chương và tổng số điểm mà vùng đó đạt được.

Huy chương vanadi tương ứng với 5 điểm

Huy chương bạc tương ứng với 3 điểm

Huy chương đồng tương ứng với 1 điểm

Tính điểm số của mỗi vùng và tổng số huy chương mà vùng đó có, rồi lần lượt đặt tên cho các cột này là total_score và total_medals. Xếp hạng dày đặc cột total_medals và đặt tên cho cột này là final_rank.

Cuối cùng, sắp xếp kết quả theo final_rank và region và 

Tự làm thử

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

Tất cả bài học trong SQL nâng cao

Tự luyện tập: Trình biên dịch Python online