【问题标题】:Removing duplicates in sql without using aggregate functions在不使用聚合函数的情况下删除 sql 中的重复项
【发布时间】:2019-03-06 18:26:23
【问题描述】:

我开始学习 java,但我的练习有问题。

这是整个代码的sn-p:

import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Connection;
import java.util.ArrayList;
import java.sql.PreparedStatement;

private static final int MAX_LINES      = 44;

private static final int REPORT_COL1    = 30;   
private static final int REPORT_COL     = 15;   

private ArrayList<String>   errors      = new ArrayList<String>();
private ArrayList<String>   detailReport    = new ArrayList<String>();
private ArrayList<String>   summaryReport=  new ArrayList<String>();

String firstSortCode= (String) parameters.get("01");

if(firstSortCode==null || firstSortCode.trim().equals("")) {
    errors.add("Missing required parameter 01");
    invalidParameters= true;
}
else {
    for(int i=0; i<SORT_CODES.length; i++) {
        if(firstSortCode.equals(SORT_CODES[i][0])) {
            pSort1              = SORT_CODES[i][1];
            sort1Attr           = SORT_CODES[i][2];
            sort1GetDescTable   = SORT_CODES[i][3];
            sort1GetDescCode    = SORT_CODES[i][4];
            sort1GetDescValue   = SORT_CODES[i][5];
            val1 = firstSortCode + " - " + pSort1;
            break;
        }
    }
    if(pSort1.equals("")) {
        errors.add("Invalid value '"+ firstSortCode + "' for parameter 01");
        invalidParameters= true;
    }
}

String mainSelectSQL ="SELECT shrdgmr_pidm, " +  
"   shrdgmr_levl_code, "+   
"   shrdgmr_grst_code, " 
"  NVL("+sort1Attr+", 'Not Reported') ";


mainSelectSQL =mainSelectSQL +
    "FROM shrdgmr " + 
    "WHERE shrdgmr_pidm is not null " + 

//Appends the ORDER BY clause
mainSelectSQL+= "ORDER BY "+sort1Attr;


//Executes the query and obtains the ResultSet
ResultSet rs= sqlStatement.executeQuery();

String sort1Desc= "***";            
String Sort1Prev= "*";

//Arrays to hold the student counts for each of the reported sort values
int sort1Count= 0;

int grandTotal = 0;

while(rs.next()) {
    String Value1       = rs.getString(2);  

    if(!Value1.equals(prevSort1Value)) {


    String sort1Record= Library.lPad(sort1Count, REPORT_COL, ' ');

    if(!sort1Desc.equals("***")) {

        if(lineCount[0]+4>MAX_LINES) {
            startNewPage(detailReport, pageCount, lineCount, currentDate, 
                databaseName, pGradTerm, pInitiator, sort1Desc, pSort1, false);
        }

            detailReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
            summaryReport.add(Library.rPad(sort1Desc, REPORT_COL1, ' ')+sort1Record);
            lineCount[0]++;
        }
        //Resets the counter
        sort1Count =0;


        sort1Desc= getSortDescription(connection, pSort1, sort1GetDescValue, sort1GetDescTable,
                                              sort1GetDescCode, Value1, errors);
    }
sort1Count++; 

我的问题是如何合并重复项并总结它们的计数?

例如,我现在的代码只是在我的摘要报告中打印以下内容,

架构 40
工程 56
牙科 66
建筑 16
计算机科学 10
工程 11
架构 5

输出应该只是:

架构 61
工程 67
牙科 66
计算机科学 10
架构 5

我只是不知道该怎么做。我正在考虑使用 hashmap 或 hashset,但我不确定如何。感谢您的任何帮助,谢谢!

【问题讨论】:

  • 使用sql的group by
  • 您的输出表明您的源表中有多行集合,您希望在返回的结果中合并它们的结果 - 也称为 聚合。这正是聚合函数的目的,那么您为什么要避免使用专门为您的问题设计的工具呢?
  • 是的,@Andronicus,除非有人试图避免聚合函数,正如 OP 所说的那样。
  • @JohnBollinger 对,在没有聚合函数的情况下进行聚合:) 拥有它们有什么意义?

标签: java sql oracle hashmap hashset


【解决方案1】:

如果实在不想在sql中使用聚合,可以使用HashMap&lt;String, Integer&gt;。类似的东西:

Map<String, Integer> aggResult = new HashMap<>();
while (rs.next()) {
    String name = rs.getString(NAME_INDEX); //NAME_INDEX - name column index
    int value = rs.getInt(VALUE_INDEX); //VALUE_INDEX - value column index

    aggResult.merge(name, value, Integer::sum);

    //if you dont have java8 use this "if":
    /*
    if (aggResult.containsKey(name)) {
        Integer sum = aggResult.get(name);
        aggResult.put(name, sum + value);
    } else {
        aggResult.put(name, value);
    }
    */
}
//test output:
aggResult.forEach((key, value) -> System.out.println(key + ": " + value));

也许您需要TreeMap(带或不带比较器)而不是HashMap 来进行排序,对来自ResultSet 的值或其他内容进行空检查。

【讨论】:

    【解决方案2】:

    必须涉及聚合函数,并且查询“没有聚合的聚合”没有任何魅力

    通过以下查询可以满足需要。我使用 sum 是因为您的 o/p 实际上看起来不像计数数据,而是已计数记录的总和

              SELECT NAME, SUM(*)
               FROM TABLE GROUP BY 
                NAME
    

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2015-06-14
      • 2014-12-19
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 2011-05-22
      • 1970-01-01
      相关资源
      最近更新 更多