查询出每个班级成绩是第一名的同学

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

其中 RANK()和DENSE_RANK()的区别就是并列第一名的时候,接下来这个同学是第二名还是第三名的区别

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

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

本文地址:https://blog.csdn.net/weixin_41896770/article/details/107625845