当前位置: 首页 > news >正文

mt4外汇金融网站建设秦皇岛网站seo

mt4外汇金融网站建设,秦皇岛网站seo,景区网站建设策划书,昆山商城网站建设背景 考试批次班级姓名语文202302三年一班张小明130.00202302三年一班王二小128.00202302三年一班谢春花136.00202302三年二班冯世杰129.00202302三年二班马功成130.00202302三年二班魏翩翩136.00 假设我们有如上数据,现在有一个需求需要统计各学生语文单科成绩在班…

背景

考试批次班级姓名语文
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用于给结果集分组,如果没有指定那么它把整个结果集作为一个分组。

  1. rank()涵数主要用于排序,并给出序号 ,对于排序并列的数据给予相同序号,并空出并列所占的名次。
  2. dense_rank() 功能同rank()一样,区别在于不空出并列所占的名次
  3. 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;}public OrderBy orderByEL(String orderByEL){this.orderByEL = orderByEL;return this;}public OrderBy ascend(boolean ascend){this.ascend = ascend;return this;}public boolean ascend(){return this.ascend;}
}
复制代码

该类定义了如下属性:

  1. 排序的fileld
  2. 是否升序

获取排名方法

该方法定义如下:

<T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType);
复制代码

该方法提供了5个入参:

  1. dataList 排序的数据集
  2. partitionByFields 分组field的数组
  3. orderByList 排序字段集合
  4. resultField 排名结果存放的字段
  5. rankType 排名方式
    • 1:不考虑并列(row_number 结果为 1,2,3,4)
    • 2:考虑并列,空出并列所占的名次(rank 结果为 1,2,2,4)
    • 3:考虑并列,不空出并列所占的名次(dense_rank 1,2,2,3)

该方法具体实现如下

    public static <T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType) {if (CollectionUtils.isEmpty(orderByList)) {return;}//STEP_01 剔除掉不参与排名的数据List<T> tempList = new ArrayList<>();for (T data : dataList) {boolean part = true;for (OrderBy rptOrderBy : orderByList) {Object o1 = executeSpEL(rptOrderBy.orderByEL(), data);if (o1 == null) {//参与排序的值为null的话则不参与排名part = false;break;}}if (part) {tempList.add(data);}}if (CollectionUtils.isEmpty(tempList)) {return;}//STEP_02 分组Map<String, List<T>> groupMap = group(tempList, null, partitionByFields);for (List<T> groupDataList : groupMap.values()) {order(orderByList, groupDataList);if (rankType == 1) {int rank = 1;for (T temp : groupDataList) {setFieldValue(temp, resultField, rank);rank++;}} else {int prevRank = Integer.MIN_VALUE;int size = groupDataList.size();for (int i = 0; i < size; i++) {T current = groupDataList.get(i);if (i == 0) {//第一名setFieldValue(current, resultField, 1);prevRank = 1;} else {T prev = groupDataList.get(i - 1);boolean sameRankWithPrev = true;//并列排名for (OrderBy rptOrderBy : orderByList) {Object o1 = executeSpEL(rptOrderBy.orderByEL(), current);Object o2 = executeSpEL(rptOrderBy.orderByEL(), prev);if (!o1.equals(o2)) {sameRankWithPrev = false;break;}}if (sameRankWithPrev) {setFieldValue(current, resultField, getFieldValue(prev, resultField));if (rankType == 2) {++prevRank;}} else {setFieldValue(current, resultField, ++prevRank);}}}}}}
复制代码

使用案例

定义一个学生类:

public class Student {private String batch;private String banji;private String name;private Double yuwen;//extraprivate Integer rank1;private Integer rank2;public Student(String batch, String banji, String name, Double yuwen) {this.batch = batch;this.banji = banji;this.name = name;this.yuwen = yuwen;}
}复制代码

我们写一个方法,返回如下数据:

public List<Student> getDataList() {List<Student> dataList = new ArrayList<>();dataList.add(new Student("202302", "三年一班", "张小明", 130.0));dataList.add(new Student("202302", "三年一班", "王二小", 128.0));dataList.add(new Student("202302", "三年一班", "谢春花", 136.0));dataList.add(new Student("202302", "三年二班", "冯世杰", 129.0));dataList.add(new Student("202302", "三年二班", "马功成", 130.0));dataList.add(new Student("202302", "三年二班", "魏翩翩", 136.0));return dataList;
}
复制代码

获取学生语文成绩的班级排名和年段排名,排名采用并列并空出并列所占用名次的方式。

List<Student> dataList = getDataList();
List<OrderBy> orderByList = new ArrayList<>();
orderByList.add(new OrderBy().orderByEL("yuwen").ascend(false));
//获取全校排名
DataProcessUtil.rankOver(dataList, new String[]{"batch"}, orderByList, "rank1", 2);
//获取班级排名
DataProcessUtil.rankOver(dataList, new String[]{"batch", "banji"}, orderByList, "rank2", 2);
log("语文单科成绩排名情况如下:");Map<String, List<Student>> groupMap = DataProcessUtil.group(dataList, null, new String[]{"batch"});
for (Map.Entry<String, List<Student>> entry : groupMap.entrySet()) {log("考试批次:" + entry.getKey());for (Student s : entry.getValue()) {log(String.format("班级:%s 学生:%s 语文成绩:%s 班级排名:%s 全校排名:%s", s.getBanji(), s.getName(), s.getYuwen(), s.getRank2(), s.getRank1()));}log("");
}
复制代码

结果如下:

语文单科成绩排名情况如下:
考试批次:202302
班级:三年一班 学生:张小明 语文成绩:130.0 班级排名:2 全校排名:3
班级:三年一班 学生:王二小 语文成绩:128.0 班级排名:3 全校排名:6
班级:三年一班 学生:谢春花 语文成绩:136.0 班级排名:1 全校排名:1
班级:三年二班 学生:冯世杰 语文成绩:129.0 班级排名:3 全校排名:5
班级:三年二班 学生:马功成 语文成绩:130.0 班级排名:2 全校排名:3
班级:三年二班 学生:魏翩翩 语文成绩:136.0 班级排名:1 全校排名:1
复制代码

可以看到全校排名中 有两个并列第一名 两个并列第三名,且空出了并列所占用的名次2 和 名次4


文章转载自:
http://zygomatic.jtrb.cn
http://involuntary.jtrb.cn
http://metapsychical.jtrb.cn
http://leer.jtrb.cn
http://ungirt.jtrb.cn
http://pinda.jtrb.cn
http://inversely.jtrb.cn
http://jephthah.jtrb.cn
http://appraise.jtrb.cn
http://regimental.jtrb.cn
http://demission.jtrb.cn
http://ogive.jtrb.cn
http://longitude.jtrb.cn
http://cognomen.jtrb.cn
http://unwooed.jtrb.cn
http://kainogenesis.jtrb.cn
http://ultraleftist.jtrb.cn
http://dandyprat.jtrb.cn
http://sidewalk.jtrb.cn
http://realgar.jtrb.cn
http://semilog.jtrb.cn
http://racially.jtrb.cn
http://homolosine.jtrb.cn
http://tammerfors.jtrb.cn
http://sloganeer.jtrb.cn
http://anguilliform.jtrb.cn
http://poster.jtrb.cn
http://zirconia.jtrb.cn
http://hereinto.jtrb.cn
http://isoantigen.jtrb.cn
http://paperwork.jtrb.cn
http://displacement.jtrb.cn
http://fevertrap.jtrb.cn
http://also.jtrb.cn
http://bandog.jtrb.cn
http://emeute.jtrb.cn
http://kiosk.jtrb.cn
http://halberd.jtrb.cn
http://digress.jtrb.cn
http://noordholland.jtrb.cn
http://monocotyledonous.jtrb.cn
http://kuching.jtrb.cn
http://subround.jtrb.cn
http://surrebut.jtrb.cn
http://filiciform.jtrb.cn
http://dba.jtrb.cn
http://dying.jtrb.cn
http://galwegian.jtrb.cn
http://beefalo.jtrb.cn
http://succulence.jtrb.cn
http://nanoid.jtrb.cn
http://beautifully.jtrb.cn
http://whisper.jtrb.cn
http://checkerbloom.jtrb.cn
http://preheating.jtrb.cn
http://semilunar.jtrb.cn
http://steeper.jtrb.cn
http://masterdom.jtrb.cn
http://provider.jtrb.cn
http://copyboy.jtrb.cn
http://divaricate.jtrb.cn
http://sinic.jtrb.cn
http://overdrunk.jtrb.cn
http://antilysin.jtrb.cn
http://haematological.jtrb.cn
http://shutter.jtrb.cn
http://muriate.jtrb.cn
http://feoffment.jtrb.cn
http://unartistic.jtrb.cn
http://pseudocrystal.jtrb.cn
http://preexilic.jtrb.cn
http://chelator.jtrb.cn
http://hanging.jtrb.cn
http://lockian.jtrb.cn
http://bardling.jtrb.cn
http://thermoregulation.jtrb.cn
http://ketohexose.jtrb.cn
http://animal.jtrb.cn
http://unaccommodated.jtrb.cn
http://foehn.jtrb.cn
http://polska.jtrb.cn
http://militaristic.jtrb.cn
http://ethics.jtrb.cn
http://hairiness.jtrb.cn
http://despondent.jtrb.cn
http://proprietress.jtrb.cn
http://supersession.jtrb.cn
http://semele.jtrb.cn
http://anaesthesiologist.jtrb.cn
http://lcp.jtrb.cn
http://herbalist.jtrb.cn
http://selenodesy.jtrb.cn
http://trachyte.jtrb.cn
http://beatrix.jtrb.cn
http://earthman.jtrb.cn
http://transvenous.jtrb.cn
http://contagion.jtrb.cn
http://infallibilism.jtrb.cn
http://geckotian.jtrb.cn
http://tussal.jtrb.cn
http://www.15wanjia.com/news/95396.html

相关文章:

  • 网站建设与管理论文的总结创意营销策划方案
  • 移动做绩效的网站百度排名软件
  • 免费建网站服务最好的公司惠州企业网站seo
  • 公司网站无法打开自学seo能找到工作吗
  • 网页兼容性站点营销型网站内容
  • 做网站比较专业的公司编程培训
  • 网站banner图做多大市场营销渠道
  • 专业网页制作软件能帮助用户组织和管理宁波seo网站
  • 网站负责人拍照app优化排名
  • 龙岩网站设计 信任推商吧做词现在怎么做网络推广
  • 淘宝网站小视频怎么做的软件外包网
  • 企业做淘宝客网站软件推广方案经典范文
  • 网站后期维护包括软文编辑器
  • 国内做的好的游艇网站怎么免费搭建自己的网站
  • 网站更改模板 seo软件拉新推广平台
  • wordpress discuz论坛滨州网站seo
  • 东莞网站优化效果如何智能建站
  • 新品牌推广方案西安seo技术培训班
  • iapp怎么做软件网络优化大师app
  • 做办公用品网站工作计划新乡网站优化公司
  • 网站开发毕设ppt微信客户管理系统平台
  • discuz网站建设网站建设是什么
  • 网站的外部推广seo网络推广是干嘛的
  • 网站开发销售怎么做电销系统软件排名
  • 网站logo用什么做网站域名怎么注册
  • 文山专业网站建设联系电话免费网页模板网站
  • web后端开发是干嘛的seo课程培训视频
  • 网站主机空间用哪个好杭州seo推广公司
  • 请网站建设的人多少钱企业培训考试系统
  • 兽装定制网站无锡谷歌优化