SQLSERVER中RANK OVER(PARTITION BY)的用法

一张学生表【姓名、班级、分数】,查询出每个班级成绩排第一的同学(按照班级的分数排名)

其中RANK() OVER()和DENSE RANK() OVER()的区别需要注意,也就是如果遇到一个并列第一的情况,其后一名是第二名还是第三名的叫法!

SELECT * FROM 
(SELECT s.name,s.class,RANK() OVER(PARTITION BY s.class ORDER BY s.score DESC)S 
FROM students s)AS S 
WHERE S=1


SELECT s.name,s.class,DENSE_RANK() OVER(PARTITION BY s.class ORDER BY s.score DESC) S 
FROM students s

 那么和GROUP BY有什么区别呢?

SELECT s.class,COUNT(1) FROM students s GROUP BY s.class
GROUP BY 一般只是分组,和聚合函数一起使用,而OVER(PARTITION BY)还有一些高级功能

如果把RANK()换成是ROW_NUMBER()会是什么个情况呢?

SELECT s.class,s.score,s.name,ROW_NUMBER() 
OVER(PARTITION BY s.class ORDER BY s.score DESC) 
FROM students s

 将不会出现并列第一的排名,这个需要注意!


版权声明:本文为weixin_41896770原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。