有一个需求是对分数进行排名,相同的分数算是同一排名名次,同时排名的名次中不会有间隔。
创建表
CREATE TABLE result ( id INT PRIMARY KEY IDENTITY, score VARCHAR(20) )
插入数据如下:
第一次想的思路是
1.进行分组排序
2.把分组排序之后的表与原有的表进行左链接排序
代码如下:
WITH temp AS( SELECT ROW_NUMBER()OVER(ORDER BY score DESC)rank,score FROM result GROUP BY score) SELECT rank,result.score FROM temp LEFT JOIN result on result.score=temp.score ORDER BY score DESC
得出的结果为
后发现更简便的方法,即用dense_rank,用这个函数即可达到排序的目的,代码如下:
select Score, dense_rank()OVER (order by score desc) as Rank from result
结果同上面一样,后面查阅还有一个rank函数,此函数也是进行排序的,但是查出来的结果就是排名的名次有间隔,代码如下:
SELECT score,RANK() OVER(ORDER BY score DESC) AS RANK FROM result
结果如下排名的名次不连贯: