国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁(yè) > news >正文

廣州城市建設(shè)網(wǎng)站宣傳推廣渠道有哪些

廣州城市建設(shè)網(wǎng)站,宣傳推廣渠道有哪些,自制100種少女心小物品,深圳網(wǎng)站建設(shè) site背景 考試批次班級(jí)姓名語(yǔ)文202302三年一班張小明130.00202302三年一班王二小128.00202302三年一班謝春花136.00202302三年二班馮世杰129.00202302三年二班馬功成130.00202302三年二班魏翩翩136.00 假設(shè)我們有如上數(shù)據(jù),現(xiàn)在有一個(gè)需求需要統(tǒng)計(jì)各學(xué)生語(yǔ)文單科成績(jī)?cè)诎唷?article class="baidu_pl">

背景

考試批次班級(jí)姓名語(yǔ)文
202302三年一班張小明130.00
202302三年一班王二小128.00
202302三年一班謝春花136.00
202302三年二班馮世杰129.00
202302三年二班馬功成130.00
202302三年二班魏翩翩136.00

假設(shè)我們有如上數(shù)據(jù),現(xiàn)在有一個(gè)需求需要統(tǒng)計(jì)各學(xué)生語(yǔ)文單科成績(jī)?cè)诎嗉?jí)中的排名和全年段排名,你會(huì)如何實(shí)現(xiàn)?

很容易的我們想到了 rank() over() 實(shí)現(xiàn)

over()是分析函數(shù),可以和 rank()、 dense_rank() 、 row_number() 配合使用。
復(fù)制代碼

使用語(yǔ)法如下:

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)
復(fù)制代碼

解釋:partition by用于給結(jié)果集分組,如果沒(méi)有指定那么它把整個(gè)結(jié)果集作為一個(gè)分組。

  1. rank()涵數(shù)主要用于排序,并給出序號(hào) ,對(duì)于排序并列的數(shù)據(jù)給予相同序號(hào),并空出并列所占的名次。
  2. dense_rank() 功能同rank()一樣,區(qū)別在于不空出并列所占的名次
  3. row_number()涵數(shù)則是按照順序依次使用 ,不考慮并列

rank 結(jié)果為 1,2,2,4 dense_rank 結(jié)果為 1,2,2,3 row_number 結(jié)果為 1,2,3,4

實(shí)際應(yīng)用中,會(huì)存在數(shù)據(jù)從其他外部系統(tǒng)接入且數(shù)據(jù)量不大等多種情況,那么使用Java代碼的方式實(shí)現(xiàn)分組排名的功能則顯得更加方便。

詳細(xì)設(shè)計(jì)及實(shí)現(xiàn)

排序定義類 OrderBy

public class OrderBy {private String orderByEL;/*** 是否升序*/private boolean ascend;public OrderBy(){//默認(rèn)升序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;}
}
復(fù)制代碼

該類定義了如下屬性:

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

獲取排名方法

該方法定義如下:

<T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType);
復(fù)制代碼

該方法提供了5個(gè)入?yún)?#xff1a;

  1. dataList 排序的數(shù)據(jù)集
  2. partitionByFields 分組field的數(shù)組
  3. orderByList 排序字段集合
  4. resultField 排名結(jié)果存放的字段
  5. rankType 排名方式
    • 1:不考慮并列(row_number 結(jié)果為 1,2,3,4)
    • 2:考慮并列,空出并列所占的名次(rank 結(jié)果為 1,2,2,4)
    • 3:考慮并列,不空出并列所占的名次(dense_rank 1,2,2,3)

該方法具體實(shí)現(xiàn)如下

    public static <T> void rankOver(List<T> dataList, String[] partitionByFields, List<OrderBy> orderByList, String resultField, int rankType) {if (CollectionUtils.isEmpty(orderByList)) {return;}//STEP_01 剔除掉不參與排名的數(shù)據(jù)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);}}}}}}
復(fù)制代碼

使用案例

定義一個(gè)學(xué)生類:

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;}
}復(fù)制代碼

我們寫(xiě)一個(gè)方法,返回如下數(shù)據(jù):

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;
}
復(fù)制代碼

獲取學(xué)生語(yǔ)文成績(jī)的班級(jí)排名和年段排名,排名采用并列并空出并列所占用名次的方式。

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);
//獲取班級(jí)排名
DataProcessUtil.rankOver(dataList, new String[]{"batch", "banji"}, orderByList, "rank2", 2);
log("語(yǔ)文單科成績(jī)排名情況如下:");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("班級(jí):%s 學(xué)生:%s 語(yǔ)文成績(jī):%s 班級(jí)排名:%s 全校排名:%s", s.getBanji(), s.getName(), s.getYuwen(), s.getRank2(), s.getRank1()));}log("");
}
復(fù)制代碼

結(jié)果如下:

語(yǔ)文單科成績(jī)排名情況如下:
考試批次:202302
班級(jí):三年一班 學(xué)生:張小明 語(yǔ)文成績(jī):130.0 班級(jí)排名:2 全校排名:3
班級(jí):三年一班 學(xué)生:王二小 語(yǔ)文成績(jī):128.0 班級(jí)排名:3 全校排名:6
班級(jí):三年一班 學(xué)生:謝春花 語(yǔ)文成績(jī):136.0 班級(jí)排名:1 全校排名:1
班級(jí):三年二班 學(xué)生:馮世杰 語(yǔ)文成績(jī):129.0 班級(jí)排名:3 全校排名:5
班級(jí):三年二班 學(xué)生:馬功成 語(yǔ)文成績(jī):130.0 班級(jí)排名:2 全校排名:3
班級(jí):三年二班 學(xué)生:魏翩翩 語(yǔ)文成績(jī):136.0 班級(jí)排名:1 全校排名:1
復(fù)制代碼

可以看到全校排名中 有兩個(gè)并列第一名 兩個(gè)并列第三名,且空出了并列所占用的名次2 和 名次4

http://aloenet.com.cn/news/46940.html

相關(guān)文章:

  • 商業(yè)廣告創(chuàng)意設(shè)計(jì)seo關(guān)鍵詞推廣怎么做
  • 全國(guó)企業(yè)信用信息平臺(tái)武漢整站優(yōu)化
  • 提供衡水網(wǎng)站建設(shè)深圳網(wǎng)站建設(shè)方案
  • 網(wǎng)頁(yè)版夢(mèng)幻西游周年慶攻略做專業(yè)搜索引擎優(yōu)化
  • web制作網(wǎng)站西安seo優(yōu)化公司
  • 網(wǎng)站建設(shè)費(fèi)開(kāi)票收候開(kāi)在哪個(gè)類別里杭州seo公司哪家好
  • 有哪些網(wǎng)站用vue做的網(wǎng)絡(luò)推廣的公司是騙局嗎
  • 網(wǎng)站的建設(shè)費(fèi)用新聞今天最新消息
  • 網(wǎng)站開(kāi)發(fā)字體選擇鄭州網(wǎng)站優(yōu)化渠道
  • 上海做網(wǎng)站中國(guó)聯(lián)通和騰訊
  • php網(wǎng)站開(kāi)發(fā)案例論文搜狗seo刷排名軟件
  • 鄭州網(wǎng)站推廣公司排名武漢百度百科
  • 東莞公司網(wǎng)站策劃怎么建立網(wǎng)站
  • 赤峰網(wǎng)站建設(shè)培訓(xùn)app制作
  • 網(wǎng)站設(shè)計(jì)方案和技巧網(wǎng)絡(luò)暴力事件
  • 成都醫(yī)院做網(wǎng)站建設(shè)太原seo排名收費(fèi)
  • 日木女人做爰視頻網(wǎng)站淘寶搜索關(guān)鍵詞排名
  • 做網(wǎng)站的電腦最好的免費(fèi)建站網(wǎng)站
  • c#網(wǎng)站開(kāi)發(fā)案例源碼app如何推廣
  • 哪里做網(wǎng)站做得好網(wǎng)站怎么做優(yōu)化排名
  • 公司制作網(wǎng)站價(jià)格長(zhǎng)春最新發(fā)布信息
  • 定制型網(wǎng)站制作明細(xì)報(bào)價(jià)表百度應(yīng)用中心
  • 東坑網(wǎng)頁(yè)設(shè)計(jì)seo技巧
  • 做外貿(mào)要自己建網(wǎng)站嗎網(wǎng)頁(yè)免費(fèi)制作網(wǎng)站
  • 桂林賣手機(jī)網(wǎng)站seo網(wǎng)站優(yōu)化快速排名軟件
  • 市場(chǎng)營(yíng)銷的八個(gè)理論seo系統(tǒng)培訓(xùn)課程
  • 做外貿(mào)對(duì)學(xué)歷要求高嗎seo經(jīng)典案例分析
  • 南京本地網(wǎng)站建設(shè)視頻專用客戶端app
  • wordpress 圖片鏈接下載成都seo整站
  • 國(guó)內(nèi)外做gif的網(wǎng)站網(wǎng)絡(luò)營(yíng)銷推廣的方式