LintCode-Logo 2460 · 球员身高排名

该博客介绍了如何使用SQL的DENSE_RANK()函数来解决球员身高排名的问题,确保排名无间隔。当球员身高相同时,他们的排名会相同,避免了排名之间的空缺。文章通过SQL示例解释了DENSE_RANK()函数的用法,并对比了不使用此函数时可能遇到的效率问题。
摘要由CSDN通过智能技术生成

请编写一个 SQL 语句,获取球员 (players) 表的身高 (height) 排名 (Rank)。
如果,两个球员一样高,则两个球员的身高排名相同。名次之间不应该有间隔。

表定义: players (球员表)
在这里插入图片描述
在这里插入图片描述

SQL
order by height desc 按从高到底排列
order by height 按从低到高排列


select height, dense_rank() over(order by height desc) 'Rank'
from players
order by 'Rank';

当不用dense_rank()的效果 扫描全表比较慢

SELECT
	s1.height height,
	(SELECT 
		COUNT(DISTINCT(s2.height))
	FROM players s2 
	WHERE s2.height>= s1.height
	) AS Rank  
FROM players s1
ORDER BY Rank

DENSE_RANK()

是一个窗口函数,它为分区或结果集中的每一行分配排名,而排名值没有间隙。

行的等级从行前的不同等级值的数量增加1。

DENSE_RANK() 函数的语法如下:

DENSE_RANK() OVER (
    PARTITION BY <expression>[{,<expression>...}]
    ORDER BY <expression> [ASC|DESC], [{,<expression>...}]
) 

在这个语法中:

首先,PARTITION BY子句将FROM子句生成的结果集划分为分区。DENSE_RANK()函数应用于每个分区。
其次,ORDER BY 子句指定DENSE_RANK()函数操作的每个分区中的行顺序。
如果分区具有两个或更多具有相同排名值的行,则将为这些行中的每一行分配相同的排名。

与RANK()函数不同,DENSE_RANK()函数始终返回连续的排名值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一叶一菩提魁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值