Student表:
+---------------+----------------+--------------------------+----------------+
--+| student.name | student.class | student.cooperator_name | student.score |
+---------------+----------------+--------------------------+----------------+
--+ | df | 3 | 测试公司1 | 45
|| asdf | 3 | 测试公司2 | 55
|| cfe | 2 | 测试公司2 | 74
|| 3dd | 3 | 测试公司5 | NULL
|| fda | 1 | 测试公司7 | 80
|| gds | 2 | 测试公司9 | 92
|| ffd | 1 | 测试公司10 | 95
|| dss | 1 | 测试公司4 | 95
|| ddd | 3 | 测试公司3 | 99
|| gf | 3 | 测试公司9 | 99
|+---------------+----------------+--------------------------+----------------+
--+
1.sum...over...
按照班级进行归类,统计总分数totalscore
select class,name,cooperator_name,score,sum(score) over(partition by class) as totalscore from student;
2.row_number()...over...
给每个班级进行排名(没有并列)
select name,class,score,row_number() over(partition by class order by score desc ) mm from student;
找出每个班级排名第一名的学生信息
在求第一名成绩的时候,不能用row_number(),因为如果同班有两个并列第一,row_number()只返回一个结果;
select * from (select name,class,score,row_number() over(partition by class order by score desc ) mm from student) s where s.mm = 1;
Rank()和dense_Rank()可以将所有的都查找出来,如上面都可以将并列第一求出来。
Rand是跳跃排序,有两个第一名,下来就是第三名
select name,class,score,rank() over(partition by class order by score desc ) mm from student;
Densc_rank()
Densc_rank()连续排序和rank()的排序不一样,当有两个并列第一的时候,会有第二名
select name,class,score,dense_rank() over(partition by class order by score desc ) mm from student;
lag()...over()...函数用法(取出前n行数据)
LAG(col,n,DEFAULT) 用于统计窗口内往上第n行值
第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)