Announcement

Collapse
No announcement yet.

Berechnungen in Oracle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Berechnungen in Oracle

    Hallo zusammen,

    ich habe noch eine Frage:

    wie kann man in Oracle eine Berechnung durchführen, in der man auf andere Werte n-1, n-2, ... zugreift. zB. man hat eine Tabelle mit Temperaturwerten:

    Code:
    ____________________
    Datum      | Wert
    ____________________
    01.01.2010 |  2.4
    02.01.2010 |  3.0
    03.01.2010 |  3.2
    04.01.2010 |  3.3
    05.01.2010 |  3.5
    ...
    und will für jeden Tag Zweitagesmittelwerte berechnen:
    d.h. für den Tag 02.01.2010 =>( Wert vom 01. + Wert vom 02. ) / 2
    => (2.4 + 3.0) / 2 = 2.7 usw.

    so dass man folgende Tabelle bekommt:

    Code:
    _________________________
    Datum      | Wert   | 2TagesMW
    _________________________
    01.01.2010 |  2.4  | ---
    02.01.2010 |  3.0  | 2.7
    03.01.2010 |  3.2  | 3.1
    04.01.2010 |  3.3  | 3.25
    05.01.2010 |  3.5  | 3.4
    ...

  • #2
    Dazu lässt sich die analytische Funktionen LAG verwenden:
    Code:
    WITH data AS
     (
       SELECT to_date('01.01.2010','DD.MM.YYYY') datum, 2.4 mess FROM dual UNION ALL
       SELECT to_date('02.01.2010','DD.MM.YYYY') datum, 3.0 mess FROM dual UNION ALL
       SELECT to_date('03.01.2010','DD.MM.YYYY') datum, 3.2 mess FROM dual UNION ALL
       SELECT to_date('04.01.2010','DD.MM.YYYY') datum, 3.3 mess FROM dual UNION ALL
       SELECT to_date('05.01.2010','DD.MM.YYYY') datum, 3.5 mess FROM dual
     )
    SELECT datum, mess, LAG(mess) OVER (ORDER BY datum) lmess,
      (mess + LAG(mess) OVER (ORDER BY datum))/2 mw
      FROM data
    
    DATUM	      MESS	LMESS	MW
    ------------------------------------------------
    01.01.2010	2,4		
    02.01.2010	3	2,4	2,7
    03.01.2010	3,2	3	3,1
    04.01.2010	3,3	3,2	3,25
    05.01.2010	3,5	3,3	3,4

    Comment


    • #3
      Oder so ähnlich:
      Code:
      WITH data AS
       (
         SELECT to_date('01.01.2010','DD.MM.YYYY') datum, 2.4 mess FROM dual UNION ALL
         SELECT to_date('02.01.2010','DD.MM.YYYY') datum, 3.0 mess FROM dual UNION ALL
         SELECT to_date('03.01.2010','DD.MM.YYYY') datum, 3.2 mess FROM dual UNION ALL
         SELECT to_date('04.01.2010','DD.MM.YYYY') datum, 3.3 mess FROM dual UNION ALL
         SELECT to_date('05.01.2010','DD.MM.YYYY') datum, 3.5 mess FROM dual
       )
      SELECT datum
            ,mess
            ,AVG(mess) OVER (ORDER BY datum ROWS 1 PRECEDING) mw
      FROM data;
      
      DATUM          MESS         MW
      01.01.10        2,4        2,4
      02.01.10          3        2,7
      03.01.10        3,2        3,1
      04.01.10        3,3       3,25
      05.01.10        3,5        3,4
      Das würde auch einen Wert für den 1. Satz liefern.

      MfG

      Ralf

      Comment


      • #4
        Danke sehr für die Antworten!

        Noch eine Frage:
        Wie soll man dann zB. Viertagesmitteltemperatur berechnen? Bei der Berechnung soll man einzelne Werte unterschiedlich gewichten:

        ( Wert(heute) + 0,5*Wert(heute - 1) + 0,25*Wert(heute - 2) + 0,125*Wert(heute - 3) )/ 1,875

        Comment


        • #5
          Das sollte doch eigentlich mit den Angaben oben kein Problem mehr sein. An die Funktion LAG kann man auch Parameter übergeben.

          Comment


          • #6
            Originally posted by diman View Post
            Danke sehr für die Antworten!

            Noch eine Frage:
            Wie soll man dann zB. Viertagesmitteltemperatur berechnen? Bei der Berechnung soll man einzelne Werte unterschiedlich gewichten:

            ( Wert(heute) + 0,5*Wert(heute - 1) + 0,25*Wert(heute - 2) + 0,125*Wert(heute - 3) )/ 1,875
            Mit einer Tabelle die dazu gejoint wird. Siehe deinen anderen Thread.
            Grüße

            Logan2012

            http://www.dbplace.de

            Comment

            Working...
            X