上次的面试除了算法不好,就连数据库的查询都忘了很多,或者说当时就没学多少吧最近就刷了一下数据库的查询,有一题是求各个科目的前三名同学的信息及分数。所以使用到排名RANK()、ROW_NUMBER()、DENSE_RANK()这三个都是和排名有关的,但是在排序的时候会有些出入。
ROW_NUMBER():
没有重复数据(100、99、98...)时依次排1、2、3...,
遇到重复的数据时(100、100、99、99、98...)时依然排(1、2、3、4、5...)
小结:重复与不重复时都是连续的排序,重复的值谁的排名在前就看查出来的结果谁在前
RANK():
没有重复数据(100、99、98...)时依次排1、2、3...,
但遇到重复的数据时(100、100、99、99、98...)时依次排(1、1、3、3、5...)
小结:数据重复时,值相同的排名并列,下一个不同值的排名等于前面数量加一(所以排名会出现不连续)
DENSE_RANK():
没有重复数据(100、99、98...)时依次排1、2、3...,
但遇到重复的数据时(100、100、99、99、98...)时依次排(1、1、2、2、3...)
小结:数据重复时,值相同的排名并列,下一个不同值的排名紧接上一个排名
总结:
ROW_NUMBER()排名连续、不会有排名并列
DENSE_RANK()排名连续、会有排名并列
RANK()排名会出现不连续、会有排名并列
补充:
有个成绩表sc,字段有课程编号(c_id),学生编号(s_id),成绩(score)
查询出各科成绩的前三名
select * from
(select
rank() over(partition by c_id order by score desc) 名次, --根据c_id分组,score降序排序
c_id 课程编号,
s_id 学生编号,
score 成绩
from sc)a
where a.名次<=3;
本文详细介绍了SQL中的三种排名函数:ROW_NUMBER(), RANK() 和 DENSE_RANK() 的使用方法及区别,并通过具体示例展示了如何利用这些函数查询成绩表中各科成绩的前三名。

1万+

被折叠的 条评论
为什么被折叠?



