daily 2017 7 10 数据汇总 - wtdig/study GitHub Wiki
1、将查询的数据结果,按照指定的规则进行汇总
案例:指定4个字段的值,全都是一样的数据合并成一条数据
代码逻辑:分批查询数据,将第一批查询的数据按照指定规则进行汇总,将合并的结果加到第二批查询到的数据上,再次按照规则进行汇总
代码原型:
List list = new ArrayList(); List newList = new ArrayList(); list.add("B"); list.add("B"); list.add("B"); list.add("D"); list.add("a"); list.add("b"); list.add("A"); list.add("B"); for (int i = 0; i < list.size(); i++) { int sum = 0; for (int j = i + 1; j < list.size(); j++) { String string1 = list.get(i); String string2 = list.get(j); if (list.get(i) == list.get(j)) { sum++; newList.add(list.get(i)); list.remove(j); j--; } } if (sum == 0) { newList.add(list.get(i)); } } List secondList = new ArrayList(); secondList.add("C"); secondList.add("D"); secondList.add("F"); secondList.add("G"); secondList.add("a"); secondList.add("b"); list.addAll(secondList); // List newList1 = new ArrayList(); newList.clear(); for (int i = 0; i < list.size(); i++) { int sum = 0; for (int j = i + 1; j < list.size(); j++) { if (list.get(i) == list.get(j)) { sum++; newList.add(list.get(i)); list.remove(j); } } if (sum == 0) { newList.add(list.get(i)); } } System.out.println(newList.toString());
案例代码:
/** * 合并的流水屏蔽流程 * * @param startPt * @param endPt * @param bt */ private void mergeBankTradeShield(String startPt, String endPt, String bt) { Integer currentPage = 1; List list; // 临时存储流水数据 List tempList = new ArrayList(); // 合并后的流水屏蔽数据 List mergeList = new ArrayList(); // 记录合并关系 Map> relationMap = new HashMap>(); boolean connectFlag = false; while (true) { list = bankTradeShieldBo.pageQueryUnshieldedBankTrade(startPt, endPt, bt, SIZE, currentPage++); // 取出数据不为空才执行 if (!CollectionUtils.isEmpty(list)) { tempList.addAll(list); mergeList.clear(); for (int i = 0; i < tempList.size(); i++) { int sum = 0; for (int j = i + 1; j < tempList.size(); j++) { // 合并处理 SacBankTradeShield tradeShieldFirst = tempList.get(i); SacBankTradeShield tradeShieldSecond = tempList.get(j); // 判断4个字段的值是否都相等 boolean flag = tradeShieldFirst.getTradeType().equals(tradeShieldSecond.getTradeType()) && tradeShieldFirst.getBankAccountNumber().equals(tradeShieldSecond.getBankAccountNumber()) && tradeShieldFirst.getBankAccountCurrencyCode().equals(tradeShieldSecond.getBankAccountCurrencyCode()) && tradeShieldFirst.getBankTradeNo().equals(tradeShieldSecond.getBankTradeNo()); if (flag) { sum++; tradeShieldFirst.setAmount(tradeShieldFirst.getAmount().add(tradeShieldSecond.getAmount())); List idValue = relationMap.get(tradeShieldFirst.getId()); if (null == idValue) { idValue = new ArrayList(); idValue.add(tradeShieldFirst.getId()); idValue.add(tradeShieldSecond.getId()); } else { idValue.add(tradeShieldSecond.getId()); } relationMap.put(tradeShieldFirst.getId(), idValue); mergeList.add(tradeShieldFirst); tempList.remove(j); j--; } } if (sum == 0) { mergeList.add(tempList.get(i)); SacBankTradeShield tradeShield = tempList.get(i); List idValue = relationMap.get(tradeShield.getId()); if (null == idValue) { idValue = new ArrayList(); idValue.add(tradeShield.getId()); } relationMap.put(tradeShield.getId(), idValue); } } } // 最后一批查询出来的数据少于1000条跳出当前循环 if (list.size() < SIZE) { break; } } if (CollectionUtils.isEmpty(mergeList)) { return; } // 通知 notify(mergeList, connectFlag); // 批量更改标识 List updateList = new ArrayList(); for (SacBankTradeShield item : mergeList) { List lists = relationMap.get(item.getId()); updateList.addAll(lists); } bankTradeShieldBo.updateByPrimaryKey(updateList); } }
1、将查询的数据结果,按照指定的规则进行汇总
案例:指定4个字段的值,全都是一样的数据合并成一条数据
代码逻辑:分批查询数据(查询时,要按照合并的条件进行排序:比如:合并的条件为;id,name,age,那么查询时要按照id,name,age asc进行排序),将查询到的结果,按照第一个与第二个进行对比,判断是否合并,第二个与第三个对比,以此类比,最后一个数据与查询全表(按照最会一个数据的合并条件进行查询)的结果进行对比,如果相同,进行合并处理
案例代码:
/** * 合并的流水屏蔽流程 */ private void mergeBankTradeShield(String startPt, String endPt, String bt) { List list = null; // 临时存储流水数据 List tempList = new ArrayList(); // 合并后的流水屏蔽数据 List mergeList = new ArrayList(); // 记录合并关系 List relationList = new ArrayList(); boolean connectFlag = false; int batch = 0; while (true) { list = bankTradeShieldBo.mergeQueryUnshieldedBankTrade(startPt, endPt, bt, SIZE); // 取出数据不为空才执行 if (CollectionUtils.isEmpty(list)) { return; } relationList.clear(); tempList.clear(); tempList.addAll(list); mergeList.clear(); SacBankTradeShield tradeShieldFirst = null; SacBankTradeShield tradeShieldSecond = null; // 记录移除的id List removeId = new ArrayList(); for (int i = 0; i < tempList.size(); i++) { // 最后一个数据 if (i == tempList.size() - 1) { tradeShieldFirst = tempList.get(i); // 查询取值 List lastList = bankTradeShieldBo.queryUnshieldBankTradeByCond(startPt, endPt, tradeShieldFirst, removeId); if (!CollectionUtils.isEmpty(lastList)) { for (SacBankTradeShield item : lastList) { tradeShieldFirst.setAmount(tradeShieldFirst.getAmount().add(item.getAmount())); relationList.add(item.getId()); } mergeList.add(tradeShieldFirst); } else { mergeList.add(tradeShieldFirst); } } else { // 相邻2个数据进行比较 tradeShieldFirst = tempList.get(i); tradeShieldSecond = tempList.get(i + 1); // 判断4个字段的值是否都相等 boolean flag = tradeShieldFirst.getTradeType().equals(tradeShieldSecond.getTradeType()) && tradeShieldFirst.getBankAccountNumber().equals(tradeShieldSecond.getBankAccountNumber()) && tradeShieldFirst.getBankAccountCurrencyCode().equals(tradeShieldSecond.getBankAccountCurrencyCode()) && tradeShieldFirst.getBankTradeNo().equals(tradeShieldSecond.getBankTradeNo()); if (flag) { tradeShieldFirst.setAmount(tradeShieldFirst.getAmount().add(tradeShieldSecond.getAmount())); tempList.remove(i + 1); removeId.add(tradeShieldSecond.getId()); i--; } else { mergeList.add(tradeShieldFirst); } } } logger.info("send notify batch:" + (batch++) + "," + "this send notify data count:" + mergeList.size()); // 通知 notify(mergeList, connectFlag); logger.info("send notify is over"); // 批量更改标识 for (SacBankTradeShield item : list) { relationList.add(item.getId()); } bankTradeShieldBo.updateByPrimaryKey(relationList); // 最后一批查询出来的数据少于1000条跳出当前循环 if (list.size() < SIZE) { break; } }
}</p>
查询最后一个数据的sql
select from sac_bank_trade_shield where is_deleted = 'n' and id not in #{ids,jdbcType=BIGINT} --排除最会一条记录的记录 and pt between #{startPt,jdbcType=VARCHAR} and #{endPt,jdbcType=VARCHAR} and bt = #{bankTrade.bt,jdbcType=VARCHAR} and notify_status = 'NO_NOTIFY' and bank_trade_no_field_name is not null and bank_account_number = #{bankTrade.bankAccountNumber,jdbcType=VARCHAR} and trade_type = #{bankTrade.tradeType,jdbcType=VARCHAR} and bank_account_currency_code = #{bankTrade.bankAccountCurrencyCode,jdbcType=VARCHAR} and bank_trade_no = #{bankTrade.bankTradeNo,jdbcType=VARCHAR}
代码示例:
枚举类
public enum CoaType {
/**
* 蚂蚁
*/
ANT("蚂蚁集团", "Antfinancial", "50388"),
/**
* 菜鸟
*/
CAINIAO("菜鸟集团", "Cainiao", "50308"),
/**
* 阿里
*/
ALIBABA("阿里巴巴集团", "Alibaba", "50288");
private String enValue;
private String chValue;
private String codeValue;
CoaType(String chValue, String enValue, String codeValue){
this.enValue = enValue;
this.chValue = chValue;
this.codeValue = codeValue;
}
public String getEnValue() {
return enValue;
}
public String getChValue() {
return chValue;
}
public String getCodeValue() {
return codeValue;
}
}
使用枚举:
public List queryCoa() { CoaType[] coas = { CoaType.ANT, CoaType.ALIBABA, CoaType.CAINIAO }; List list = Lists.newArrayListWithCapacity(coas.length); boolean langEN = I18nUtil.isLangEN(); for (int i = 0; i < coas.length; i++) { list.add(new SacComboBoxVo(langEN ? coas[i].getEnValue() : coas[i].getChValue(), coas[i].getCodeValue())); } return list; }