最近一直在了解与学习sqlserver 窗口函数的各种知识,发现窗口函数能够很方便实现在之前可能需要关联子查询等一些复杂的逻辑才能实现的逻辑,下边是自己的一些学习笔记。
RANK函数:从小到大,每次最苦逼的就是考试了,肿么都会有一个结果排名,张三数学第一,李四、小明并列第二...。这应该是我们最早接触到的排名概念,sqlserver 中rank 也是这样的意思,和row_number() 区别就是rownum会为每个分区值相同的去一个随机排名,即排名不会存在并列的情况
创建一个数据表:包含班级编号、课程编号、学生编号、学生成绩(T_StudentGrade ClassId ,CourseId ,StudentId ,SGrade )
1:获得每个班级,每门课程同学们的成绩排名情况(成绩相同,并列排名)
1 SELECT id , 2 ClassId , 3 CourseId , 4 StudentId , 5 SGrade , 6 RANK() OVER ( PARTITION BY ClassId, CourseId ORDER BY SGrade DESC ) AS rownum 7 FROM dbo.T_StudentGrade;
2:获得每门课程的排名前三学生情况
1 WITH tmpTable AS ( 2 SELECT id , 3 ClassId , 4 CourseId , 5 StudentId , 6 SGrade , 7 RANK() OVER ( PARTITION BY CourseId ORDER BY SGrade DESC ) AS ScoreRank 8 FROM dbo.T_StudentGrade) 9 SELECT * FROM tmpTable WHERE tmpTable.ScoreRank<4