以动态方式计算双变量的平均值

时间:2014-11-25 11:13:38

标签: java database average

我是java的新手。这个问题可能有答案,但我找不到答案。 我必须在java中创建一个方法,我必须从数据库中检索值,并且必须考虑那些在数据库中没有显示“OFF”的列值。然后必须计算这些值的平均值。现在我是查看数据库并手动考虑那些具有一些双值而不是“OFF”的列。但现在必须动态完成。 我有8列,其中我只需要3列,因为在其他列中没有值只有“OFF”显示,其平均值我能够计算。它的代码是

 try {
   con = getConnection();


   String sql = "exec vcs_gauge @gauge_name=?,@first_rec_time=?,@last_rec_time=?";


   clstmt = con.prepareCall(sql);
   clstmt.setString(1, "vs3_bag");
   clstmt.setString(2, "2014-09-01 10:00:00");
   clstmt.setString(3, "2014-09-01 11:00:00");
   clstmt.execute();
   rs = clstmt.getResultSet();



   while (rs.next()) {
     a4 = rs.getDouble(7);
     a5 = rs.getDouble(8);
     a6 = rs.getDouble(10);
     averageMap3.put(rs.getString(1), (a4 + a5 + a6) / 3.0);

   }


   //System.out.println("valus is" +averageList);

我现在想要的是,不是指定我想要的列,而是执行一个条件,检查是否有任何检索到的列具有字符串“OFF”值,然后不考虑进行平均计算。 我必须以行方式计算平均值,即计算一行中所有列的平均值。 提前谢谢

3 个答案:

答案 0 :(得分:1)

你可以执行一个sql查询,选择一切接受值为" OFF" 或者您可以先选择可能具有“关闭”的列。价值并检查它是否有“关闭”和“关闭”。是否......如果没有,则继续进行计算。

编辑 - 示例:

while (rs.next()) {
    ResultSetMetaData rsmd = rs.getMetaData();
    boolean x = false;
    for(int i = 0; i < rsmd.getColumnCount(); i++) {
        if(rs.getString(i).equals("OFF")){
            x = true;
        }
    }
    if(x == false){
        // edit to dynamically do an average....
        double sum = 0;
        int count = 0;
        for(int i = 0; i < rsmd.getColumnCount(); i++) {
            int type = rsmd.getColumnType(i);
            if(type == Types.DOUBLE) {
                sum = sum + rs.getDouble(i);
                count ++;
            }
        }
        averageMap3.put(rs.getString(1), (sum/count));
    }
}

答案 1 :(得分:1)

您必须将构建平均值的步骤分解为多个步骤。例如:

while (rs.next()) {
    double sum = 0;
    int count = 0;

    if (!"OFF".equals(rs.getString(7))) {
        sum += rs.getDouble(7);
        count += 1;
    }

    if (!"OFF".equals(rs.getString(8))) {
        sum += rs.getDouble(8);
        count += 1;
    }

    if (!"OFF".equals(rs.getString(10))) {
        sum += rs.getDouble(10);
        count += 1;
    }

    double average;
    if (count > 0)
        average = sum / count;
    else
        average = 0; // or whatever the result of all OFF means

    averageMap3.put(rs.getString(1), average);
}

应该有更短的方法来实现同样的目标,但这是一个良好的开端。

e.g。同样的事情,但循环和使用?操作

while (rs.next()) {
    double sum = 0;
    int count = 0;
    for (int column : new int[] { 7, 8, 10 }) {
        if (!"OFF".equals(rs.getString(column))) {
            sum += rs.getDouble(column);
            count += 1;
        }
    }
    double average = count > 0 ? sum / count : 0;
    averageMap3.put(rs.getString(1), average);
}

答案 2 :(得分:0)

您正在阅读许多您不需要的数据,这会使其变得缓慢而复杂。一个更简单的解决方案就是满足您的需求。

String sql = "SELECT key, (col7 + col8 + col9)/3 FROM my_table" +
             " WHERE  on_off <> 'OFF' AND gauge_name=?" +
             " AND first_rec_time>=? AND last_rec_time<=?";

如果必须使用此存储过程,可以将其放入临时表中并选择所需的结果。

这将只下载您需要的数据,密钥和平均值。