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ụ:
| 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 table1Kết quả trả về:
| 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() 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.
Thử thách
Trung bìnhMộ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.regionTất cả bài học trong SQL nâng cao
Tự luyện tập: Trình biên dịch Python online