一张学生表【姓名、班级、分数】,查询出每个班级成绩排第一的同学(按照班级的分数排名)
其中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版权协议,转载请附上原文出处链接和本声明。