请编写一个 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()函数始终返回连续的排名值。