Menu
CoddyTech

RANK 和 DENSE_RANK 函数

Coddy 高级 SQL 课程的第 9 课,共 13 课。

ROW_NUMBER() 是一种排名函数,另外还有两种:RANK() 和 DENSE_RANK()。

RANK() 函数像 ROW_NUMBER() 一样为行编号,但相同的行会得到相同的编号,而且会跳过编号。DENSE_RANK() 与 RANK() 类似,但不会跳过编号。

例如:

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

这会返回:

idlevelrow_numrow_rankrow_dense_rank
15111
26222
36322
47443
57543
65664

ROW_NUMBER() 的值从 1 到 6,且各不相同;RANK() 对相同的级别给出相同的值,但会跳过 3 和 5;DENSE_RANK() 也会对相同的级别给出相同的值,但不会跳过任何值。

challenge icon

挑战

中等

特定的虚构地区会获得奖牌。地区的成绩根据其奖牌总数和得分总数来衡量。

钒 奖牌代表 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中的所有课

自己练习: Python 在线编译器