SQL Nur Datensatz zurückgeben, in dem ein Wert geändert wurde

FaKer

Cadet 4th Year
Dabei seit
Jan. 2004
Beiträge
99
Hallo zusammen,

ich habe eine Tabelle die aus aus den Spalten Timestamp und Preis besteht. Der Preis ändert sich blos alle paar Stunden, in der Tabelle wird der Preis allerdings jede Minute gespeichert.

Ich möchte nun ein MySQL-Query haben, das mir blos die Zeilen zurückgibt, bei denen sich der Preis geändert hat.

Beispiel:

timestamp | preis
--------------------------
0 | 5
60 | 10
120 | 10
180 | 10
240 | 15
300 | 15
360 | 15
420 | 20
.... | 20

Ich hätte nun also gerne als Ergebnis des My-SQL-Query die Zeilen mit dem Inhalt: "0 | 5", "60 | 10", "240 | 15" und "420 | 20".

Die Tabelle besteht aus weit über 10.000 Datensätze. Da das Ergebnis an ein Android-Phone übertragen werden soll, sollte der Informationsgehalt eine Zeile natürlich so hoch wie möglich sein.

Danke für Eure Hilfe!

Viele Grüße.
 

Krafty

Lt. Commander
Dabei seit
Sep. 2009
Beiträge
1.177
Hallo,

ich bin mir nicht 100% sicher, aber würde es ein einfaches GROUP BY nicht für dich tun?

SELECT * FROM table GROUP BY preis

Damit sollte jeder Preis nur einmal auftauchen, optimalerweise gepaart mit dem ersten Wert der timestamp an dem er sich geändert hat.

Edit:

Vergiss das, die Query sollte Preise welche später wieder den selben Wert annehmen nicht berücksichtigen.
 
Zuletzt bearbeitet:

FaKer

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Jan. 2004
Beiträge
99
Ja genau, das hatte ich auch schon versucht. Aber mit genau dem Ergebnis, das du gepostet hast ;)
 

FaKer

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Jan. 2004
Beiträge
99
Problem ist, dass die Daten über nen REST-Webservice an die Android App geschickt werden. Um den Traffic gering zu halten, möchte ich die Daten bereits durch das SQL-Query filtern. Da ich den REST Service via Netbeans erstellen lies, sind die Möglichkeiten, die Daten auf dem Server weiters zu verarbeiten, sehr begrenzt.

Die einzige Möglichkeit die Datenmenge zu begrenzen besteht für momentan darin, die Daten durch das SQL Query zu filtern. :/ nicht grad die Optimale Ausganssituation...
 

volcem

Lieutenant
Dabei seit
Dez. 2007
Beiträge
1.020
Wäre es möglich eine neue Tabelle anzulegen und dann diese zu vergleichen und dann unterscheide auszugeben?

Also Tabelle 1 = 2

>1< | <2>
0:5 != 0:4 = Ausgabe

So in etwa?

Wie das ganze aussehen würde, müsste ich auch erst nachschauen, aber generell denke ich dass dies alle Datenbanken unterstützen in form von einem Join und der Vergleichsoperatoren?
 
Zuletzt bearbeitet:

FaKer

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Jan. 2004
Beiträge
99
Leider nein, kann/darf an der vorhandenen DB-Struktur keine Veränderungen vornehmen :/
 

talyesin

Cadet 1st Year
Dabei seit
März 2011
Beiträge
13
Versuchs mal hiermit:

Code:
  SELECT PREIS, 
         MIN(TIMESTAMP) 
    FROM TABLE 
GROUP BY PREIS 
ORDER BY MIN(TIMESTAMP)
 

Elessar_CH

Cadet 4th Year
Dabei seit
Dez. 2007
Beiträge
111
Code:
SELECT * FROM table t1
WHERE price != 
    (SELECT price from table where timestamp = 
        (SELECT MAX(timestamp) FROM table where timestamp < t1.timestamp))

Das innerste Query wählt jeweils den Timestamp des Record zuvor.
Das mittlere Query liest den Preis aus diesem Record und das äussere prüft dann noch, sich dieser verändert hat.
Ob das in der Art funktioniert, bin ich mir grad nicht sicher. Dies ist vermutlich auch vom verwendeten DBMS abhängig.
 

FaKer

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Jan. 2004
Beiträge
99
Zitat von talyesin:
Versuchs mal hiermit:

Code:
  SELECT PREIS, 
         MIN(TIMESTAMP) 
    FROM TABLE 
GROUP BY PREIS 
ORDER BY MIN(TIMESTAMP)

Die Preise können sich auch wiederholen. Heißt also, die steigen nicht immer weiter, sondern fallen auch mal wieder auf ein niedrigeres Niveau. Sobald ich "GROUP BY preis" mache, wird ein Preis lediglich einmal angezeigt.


Zitat von Elessar_CH:
Code:
SELECT * FROM table t1
WHERE price != 
    (SELECT price from table where timestamp = 
        (SELECT MAX(timestamp) FROM table where timestamp < t1.timestamp))

Das innerste Query wählt jeweils den Timestamp des Record zuvor.
Das mittlere Query liest den Preis aus diesem Record und das äussere prüft dann noch, sich dieser verändert hat.
Ob das in der Art funktioniert, bin ich mir grad nicht sicher. Dies ist vermutlich auch vom verwendeten DBMS abhängig.

Gute Idee, aber ich glaube dass das nur machbar ist, wenns weniger Datensätze sind?! Ich warte nun nämlich schon seit knapp 10 Minuten auf das Ergebnis der Abfrage.
Trotzdem Danke an euch beide!
 

talyesin

Cadet 1st Year
Dabei seit
März 2011
Beiträge
13
Wenn du Datensätze immer mit dem direkten logischen Vorgänger vergleichen willst, wirst du wohl oder übel eine Funktion oder Prozedur schreiben müssen, welche dir die Daten aufbereitet und entsprechend zurückgibt.
 

Elessar_CH

Cadet 4th Year
Dabei seit
Dez. 2007
Beiträge
111
Öh... ja stimmt, sorry.
Bei meinem Query werden für jeden Datensatz noch zwei weitere Queries ausgeführt.
Wenn du eine Million Datensätze hast, sind das dann, selbst wenn jeder Query nur 50ms dauert, ca. 14h.
So wie ich das sehe, machst du vermutlich am besten eine Stored-Procedure oder so, wo du die ganzen Daten lädst, die die du benötigst schön sequentiell heraussuchst und dann zurückgibst.
Ich würde allerdings empfehlen, zwischen DB und Service einzugreifen. Wie das geht weiss ich in deinem Falle nicht, da ich mit VS arbeite. Aber ich denke, dass NetBeans dies auch erlaubt.
 
Y

yxcv

Gast
Hallo FaKer,
wie schnell ist denn dieser Code?

PHP:
SELECT TOP 1000 timestamp 
      ,preis 
/*      ,NeuerPreis = ISNULL( (SELECT TOP 1 preis   
                      FROM Preisänderung t2   
                      WHERE t2.timestamp < t1.timestamp  
                      ORDER BY t2.timestamp desc),preis) 
*/
  FROM Preisänderung t1 
  Where Preis != (    SELECT TOP 1 preis  
                    FROM Preisänderung t2   
                    WHERE t2.timestamp < t1.timestamp  
                    ORDER BY t2.timestamp desc) 
    OR t1.timestamp = 0
 
Zuletzt bearbeitet:

Krafty

Lt. Commander
Dabei seit
Sep. 2009
Beiträge
1.177
Mir ist zu dem Thema gerade noch etwas eingefallen:

Warum änderst du nicht die INSERT Routine dahingehend, dass nur Werte eingetragen werden die sich vom Vorgänger unterscheiden?

Besteht diese Möglichkeit?
 
Top