背景
考试批次 | 班级 | 姓名 | 语文 |
---|---|---|---|
202302 | 三年一班 | 张小明 | 130.00 |
202302 | 三年一班 | 王二小 | 128.00 |
202302 | 三年一班 | 谢春花 | 136.00 |
202302 | 三年二班 | 冯世杰 | 129.00 |
202302 | 三年二班 | 马功成 | 130.00 |
202302 | 三年二班 | 魏翩翩 | 136.00 |
假设我们有如上数据,现在有一个需求需要统计各学生语文单科成绩在班级中的排名和全年段排名,你会如何实现?
很容易的我们想到了 rank() over() 实现
over()是分析函数,可以和 rank()、 dense_rank() 、 row_number() 配合使用。
复制代码
使用语法如下:
RANK() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
dense_rank() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
ROW_NUMBER() OVER(PARTITION BY COLUMN ORDER BY COLUMN)
复制代码
解释:partition by用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。
- rank()涵数主要用于排序,并给出序号 ,对于排序并列的数据给予相同序号,并空出并列所占的名次。
- dense_rank() 功能同rank()一样,区别在于不空出并列所占的名次
- row_number()涵数则是按照顺序依次使用 ,不考虑并列
rank 结果为 1,2,2,4 dense_rank 结果为 1,2,2,3 row_number 结果为 1,2,3,4
实际应用中,会存在数据从其他外部系统接入且数据量不大等多种情况,那么使用Java代码的方式实现分组排名的功能则显得更加方便。
详细设计及实现
排序定义类 OrderBy
public class OrderBy {
private String orderByEL;
/**
* 是否升序
*/
private boolean ascend;
public OrderBy(){
//默认升序
this.ascend = true;
}
public String orderByEL(){
return this.orderByEL;
}
pub