# errechnen eines mittelwertes vom jdbc rSet



## kubi (12. Jul 2006)

hallo leute!

ich vor laaanger zeit mal ein problem gepostet, welches wieder aktuell ist.

ich wollte ein zeitfenster bauen, fuer das werte aus meiner db gemittelt werden.

ich hab also 2 spalten, von denen eine die zeit, die andere die zu mittelnden werte speichert. 

ueber die zeit-spalte soll ein 60s fenster laufen und alle werte innerhalb dieses zeitfensters mitteln.

ich habe folgenden code soweit geschrieben und bin nun stecken geblieben. 

vieleicht kann mir da jemand den noetigen durchblick vermitteln. DANKE!



```
try{
            Statement s = con.createStatement();
            s.executeQuery("Select ttime, simTime from ttbylink WHERE link = '1:2'");
            ResultSet rs = s.getResultSet();
            while(rs.next()){
                oneRow.add(rs.getFloat("ttime"));
                oneRow.add(rs.getFloat("simTime"));
                rows.add(oneRow);
            }
            int minute = 1;
            int index = 1;
            Float Time1 = oneRow.get(index);
            Float AggVal = oneRow.get(index-1);
            Float Value;
            Float Time;
            
            Vector<Float> vValue = new Vector<Float>();
            
            for(int i=0; i<oneRow.size(); i++){
                Time = oneRow.get(index);
                Value = oneRow.get(index-1);
                vValue.add(Value);
                int maxValuesVector;
                double meanValue = 0;
                                  
                    for(int j=0; j<vValue.size(); j++){
                        meanValue += vValue.get(j);
                        if(Time<Time1+(minute*60)){
                        meanValue /= vValue.size();
                        System.out.println(meanValue);
                        }
                    
                   else{
                    minute = minute +1;
                    AggVal = Value;
                    System.out.println("####");
                    }
                    index = index +2;
            }                   
        }            
        rs.close();
        s.close();
        }
        catch(Exception e){
            System.out.println("Error" + e);
      }
```


----------



## André Uhres (12. Jul 2006)

kubi hat gesagt.:
			
		

> ..ich habe folgenden code soweit geschrieben und bin nun _stecken geblieben_..


Ich hab deinen Entwurf jetzt noch nicht durchgeackert, denn "_stecken geblieben_" scheint mir 
ein wenig dürftig als Problemstellung  :?


----------



## kubi (12. Jul 2006)

hi andré

sorry fuer die etwas sehr wage beschreibung.

ich hab mein resulset in eine arrayList gepackt. arrayList.get(0) ist ja die erste position und dann arrayList(1) und so weiter. die werte der einen spalte sind ja immer mit .get(i) und die der anderen mit .get(i+1) zu bekommen.

wie kann ich nun den mittelwert fuer alle werte Value berechnen, wenn die if anweisung wahr ist, also wenn alle werte value innerhalb meines zeitfensters sind?

danke!


----------



## André Uhres (12. Jul 2006)

kubi hat gesagt.:
			
		

> ..ich hab mein resulset in eine arrayList gepackt. arrayList.get(0) ist ja die erste position und dann arrayList(1)
> und so weiter. die werte der einen spalte sind ja immer mit .get(i) und die der anderen mit .get(i+1) zu bekommen...


Du hast ja eigentlich eine Liste von Listen. oneRow musst du demnach in der Schleife "while(rs.next()){..}"
jedesmal neu instanzieren! (oneRow = new ArrayList()).
Hier ist mal ein Beispielcode das auch ohne ResultSet läuft und die rows einfach nur zu Testzwecken generiert:

```
//package schnipsel4;
/*
 * MittelDemo.java
 */
import java.util.*;
public class MittelDemo{
    private List<Float> oneRow;
    private List<List<Float>> rows;
    public MittelDemo() {
        test();
    }
    private void test(){
        rows  =  new ArrayList<List<Float>>();
        for (int i = 0; i < 200; i++) {
            oneRow = new ArrayList<Float>();
            oneRow.add((float)i);
            oneRow.add((float)i);
            rows.add(oneRow);
        }
        int rowsIndex = 0;
        float fensterUpperLimit = 0f;
        float fensterSumme, fensterAnzahl;
        while(rowsIndex < rows.size()) {
            fensterSumme = 0f;
            fensterAnzahl = 0f;
            fensterUpperLimit += 60;
            while(rowsIndex < rows.size() && rows.get(rowsIndex).get(0) <= fensterUpperLimit ){
                fensterSumme += rows.get(rowsIndex).get(1);
                fensterAnzahl++;
                rowsIndex++;
            }
            System.out.println("fensterUpperLimit="+fensterUpperLimit
                    +"  fensterSumme="+fensterSumme
                    +"  fensterAnzahl="+fensterAnzahl
                    +"  Mittelwert="+(fensterSumme/fensterAnzahl)
                    );
        }
    }
    public static void main(String args[]) {new MittelDemo();}
}
```

EDIT: Ich bin mir nicht sicher welche Variante du willst. 
Hier wandert das Fenster im Zeilentakt statt im Minutentakt:

```
int rowsIndex = 0;
        int fensterIndex;
        float fensterUpperLimit;
        float fensterSumme, fensterAnzahl;
        while(rowsIndex < rows.size()) {
            fensterIndex = rowsIndex;
            fensterSumme = 0f;
            fensterAnzahl = 0f;
            fensterUpperLimit = rows.get(rowsIndex).get(1) + 60;
            while(fensterIndex < rows.size() && rows.get(fensterIndex).get(0) <= fensterUpperLimit ){
                fensterSumme += rows.get(fensterIndex).get(1);
                fensterAnzahl++;
                fensterIndex++;
            }
            System.out.println("fensterUpperLimit="+fensterUpperLimit
                    +"  fensterSumme="+fensterSumme
                    +"  fensterAnzahl="+fensterAnzahl
                    +"  Mittelwert="+(fensterSumme/fensterAnzahl)
                    );
            rowsIndex++;
        }
```


----------



## AlArenal (12. Jul 2006)

Hat es nen bestimmten Grund, warum du deine Berechnungen nicht in der DB machst? MIt SQL kann noch mehr machen, als nur Daten ablegen, lesen, ändern und löschen.


----------

