RANK 和 DENSE_RANK 函数
Coddy 高级 SQL 课程的第 9 课,共 13 课。
ROW_NUMBER() 是一种排名函数,另外还有两种:RANK() 和 DENSE_RANK()。
RANK() 函数像 ROW_NUMBER() 一样为行编号,但相同的行会得到相同的编号,而且会跳过编号。DENSE_RANK() 与 RANK() 类似,但不会跳过编号。
例如:
| 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 table1这会返回:
| 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() 的值从 1 到 6,且各不相同;RANK() 对相同的级别给出相同的值,但会跳过 3 和 5;DENSE_RANK() 也会对相同的级别给出相同的值,但不会跳过任何值。
挑战
中等特定的虚构地区会获得奖牌。地区的成绩根据其奖牌总数和得分总数来衡量。
钒 奖牌代表 5 分
银牌代表 3 分
铜牌代表 1 分
计算每个地区的得分和奖牌总数,并分别将这两列命名为 total_score 和 total_medals。对 total_medals 列进行密集排名,并将此列命名为 final_rank。
最后,按 final_rank 和 region 排序结果,并且
亲手试试
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高级 SQL中的所有课
4总结
最终挑战 #1自己练习: Python 在线编译器