Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Werte in einer Spalte vergleichen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Werte in einer Spalte vergleichen

    Hallo,

    ich möchte in einer Tabelle die Werte einer Spalte vergleichen. Meine Tabelle sieht in etwa so aus:

    ID | Datum | spalte1 | spalte 2 | spalte 3
    1 | 2013.02.10 | 0.5 | 0.9 | 151
    2 | 2013.01.15 | 1.2 | 0.9 | 151
    3 | 2013.02.28 | 1.3 | 0.9 | 151
    4 | 2013.02.16 |1.9 | 0.9 | 151
    5 | 2013.02.07 | 1.2 | 0.9 | 151
    usw. (ca. 1000 Zeilen)

    Ziel meiner Abfrage ist es, steigende Werte in spalte1 zu ermitteln - sprich: Werte, die gegenüber der Zeile davor gestiegen sind.

    Dazu sollte als erstes mal die Tabelle nach dem Feld 'Datum' aufsteigend sortiert werden. Anschließend sollte die Abfrage nach dem Motto Wert[n] > Wert[n-1]? erfolgen.
    Aktuell lese ich die Ganze Tabelle aus und mache den Vergleich in PHP aber das find ich nicht besonders schön. Das muss doch mit einem SQL Query auch umsetzbar sein?

    Vielleicht noch ein Wort zu den Spalten 'ID' und 'Datum' - diese sind nicht lückenlos hochgezählt - daher ist die Sortierung nach 'Datum' unbedingt nötig damit nicht die falschen Werte miteinander verglichen werden.

    Danke für Eure Tipps.

  • #2
    Zitat von mittererr Beitrag anzeigen
    Hallo,

    ich möchte in einer Tabelle die Werte einer Spalte vergleichen. Meine Tabelle sieht in etwa so aus:

    ID | Datum | spalte1 | spalte 2 | spalte 3
    1 | 2013.02.10 | 0.5 | 0.9 | 151
    2 | 2013.01.15 | 1.2 | 0.9 | 151
    3 | 2013.02.28 | 1.3 | 0.9 | 151
    4 | 2013.02.16 |1.9 | 0.9 | 151
    5 | 2013.02.07 | 1.2 | 0.9 | 151
    usw. (ca. 1000 Zeilen)

    Ziel meiner Abfrage ist es, steigende Werte in spalte1 zu ermitteln - sprich: Werte, die gegenüber der Zeile davor gestiegen sind.

    Dazu sollte als erstes mal die Tabelle nach dem Feld 'Datum' aufsteigend sortiert werden. Anschließend sollte die Abfrage nach dem Motto Wert[n] > Wert[n-1]? erfolgen.
    Aktuell lese ich die Ganze Tabelle aus und mache den Vergleich in PHP aber das find ich nicht besonders schön. Das muss doch mit einem SQL Query auch umsetzbar sein?

    Welche DB?

    Falls PG, könnt ich Dir helfen, Stichwort window-functions, lag() - Funktion.


    Andreas

    Kommentar


    • #3
      ist eine MySQL Datenbank - hast Du da auch eine Idee?

      Kommentar


      • #4
        Zitat von mittererr Beitrag anzeigen
        ist eine MySQL Datenbank - hast Du das auch eine Idee?
        Nein, aber vielleicht andere hier.

        Andreas

        Kommentar


        • #5
          Stichwort "SELF-JOIN" - du vergleichst die Tabelle mit einer Kopie ihrer selbst - musst dann natürlich über die Bedingungen abdecken, dass deine Vorgabe erfüllt wird - ich würde dir aber empfehlen, deine Tabelle PERMANENT so zu sortieren, dass zumindest das Datum ZWINGEND steigt - es ist auch relativ unlogisch, dass ein ALTER Datensatz (laut auto-ID muss der ja früher angelegt worden sein) ein höheres Datum enthält, als ein ID-mäßig später angelegter Datensatz

          EVTL kannst du dir auch über eine Zusatzspalte speziell für die Sortierung basteln

          Kommentar


          • #6
            Zitat von akretschmer Beitrag anzeigen
            Nein, aber vielleicht andere hier.

            Andreas
            Den Hinweis auf self-join hast ja, vielleicht bekommst es ja hin. In PG würde es übrigens etwa so gehen:

            Code:
            test=*# select id, datum, spalte1, lag(spalte1) over (order by datum), spalte1 - lag(spalte1) over (order by datum) as differenz from foo;
             id |   datum    | spalte1 | lag | differenz
            ----+------------+---------+-----+-----------
              2 | 2013-01-15 |     1.2 |     |
              5 | 2013-02-07 |     1.2 | 1.2 |       0.0
              1 | 2013-02-10 |     0.5 | 1.2 |      -0.7
              4 | 2013-02-16 |     1.9 | 0.5 |       1.4
              3 | 2013-02-28 |     1.3 | 1.9 |      -0.6
            (5 rows)

            Kommentar


            • #7
              Ich habe die Tabelle jetzt mal nach datum sortiert und die ID neu durchgezählt.

              Folgende Query hab ich jetzt im Code:

              Code:
              'SELECT * FROM stockvalues_1 t1 JOIN stockvalues_1 t2 ON t1.id = t2.id-1 WHERE t1.spalte1 > t2.spalte1'
              Die zurückgegebenen Werte sind aber nicht korrekt - sieht jemand den Fehler?

              Kommentar


              • #8
                Zitat von mittererr Beitrag anzeigen
                Ich habe die Tabelle jetzt mal nach datum sortiert und die ID neu durchgezählt.

                Irgendwie kann das aber keine Lösung sein: wenn die ID als Fremdschlüssel dient, geht das massiv in die Hosen...

                Andreas

                Kommentar


                • #9
                  Ich konnte das Problem jetzt folgendermaßen lösen:

                  PHP-Code:
                  //steigende Werte
                  $stockvalues $this->Stockvalue->query('SELECT * FROM stockvalues_1 t1 JOIN stockvalues_1 t2 ON t1.spalte1 > t2.spalte1 WHERE t2.id = t1.id-1');
                  //fallende Werte
                  $stockvalues $this->Stockvalue->query('SELECT * FROM stockvalues_1 t1 JOIN stockvalues_1 t2 ON t1.spalte1 < t2.spalte1 WHERE t2.id = t1.id-1'); 
                  Vielen Dank für Eure Hinweise!

                  Kommentar

                  Lädt...
                  X