MySQL Nur die Datensätze zurückgeben, in denen ein anderer Preis steht

f4b1

Mitglied
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
480 | 15
...

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

Die Tabelle besteht aus weit über 10.000 Datensätze. Da das Ergebnis an ein Android-Phone übertragen werden soll, gilt es natürlich so wenig Daten wie möglich zu übertragen. Deshalb wäre es ja schwachsinnig, zig Datensätze zu übertragen, die jeweils denselben Preis haben.

Danke für Eure Hilfe!

Viele Grüße.
 
in der Tabelle wird der Preis allerdings jede Minute gespeichert.

Kannst du darauf Einfluss nehmen? Und werden diese Einträge an einer anderer Stelle gebraucht?
Weil wenn nicht, wäre die Frage wieso diese dann überhaupt abgelegt werden?Man kann ja vorher schauen ob der Wert vom letzten Eintrag gleich ist...Ansonsten kann man sich auch überlegen eine neue Relation zu erstellen wo du dann nur die Zeiten ablegst wo eine Veränderung stattgefunden hat und eben dann über den Schlüssel auf die andere referenzierst ?!

Eine Abfrage in der Form wie du jetzt hast, fiele mir spontan auch nicht ein 😳
 
Code:
select * from test t1, test t2
where t1.b != t2.b and t1.a < t2.a
  and 0 = (select count(*) from test t3 where t3.a > t1.a and t3.a < t2.a)  [1]
order by t1.a
b = preis, a = zeit

Preis muss sich unterscheiden, Zeit ist zeitlich geordnet,
[1] gesucht sind nur benachbarte Einträge, bei durchgehender Id wäre das mit +1 einfacher,
so eben auf diese Weise testen, es darf keine Einträge dazwischen geben

edit: Timestamp-Abstand 60 bzw. unter 100 kann man auch nehmen, scheint ja konstant zu sein?
 
Zuletzt bearbeitet von einem Moderator:
Jo genau, der Abstand ist 60 Sekunden.

Ich werds mal testen und dann posten obs geklappt hat, danke!


Code:
select * from test t1, test t2
where t1.b != t2.b and t1.a < t2.a
  and 0 = (select count(*) from test t3 where t3.a > t1.a and t3.a < t2.a)  [1]
order by t1.a
b = preis, a = zeit

Preis muss sich unterscheiden, Zeit ist zeitlich geordnet,
[1] gesucht sind nur benachbarte Einträge, bei durchgehender Id wäre das mit +1 einfacher,
so eben auf diese Weise testen, es darf keine Einträge dazwischen geben

edit: Timestamp-Abstand 60 bzw. unter 100 kann man auch nehmen, scheint ja konstant zu sein?


Mhh, die Abfrage läuft nun seit 10 Minuten und hat noch kein Ergebnis geliefert.. :/
Die Tabelle hat knapp 130.000 Einträge, daran wirds wohl liegen
 
Zuletzt bearbeitet:
Hallo zusammen,

wenn der Zeitabstand konstant 60 Sekunden ist,
hätte ich diese Lösung anzubieten:

Code:
SELECT t1.timestamp, t1.preis 
FROM test t1
WHERE NOT t1.preis IN
 (
  SELECT t2.preis 
  FROM test t2 
  WHERE t2.timestamp = t1.timestamp-60 
 )

Sollte das noch zu langsam sein, könnte man
noch einen Index auf die Spalte "timestamp" legen.

VG ROlf
 
Zuletzt bearbeitet:
Hallo zusammen,

wenn der Zeitabstand konstant 60 Sekunden ist,
hätte ich diese Lösung anzubieten:

Code:
SELECT t1.timestamp, t1.preis 
FROM test t1
WHERE NOT t1.preis IN
 (
  SELECT t2.preis 
  FROM test t2 
  WHERE t2.timestamp = t1.timestamp-60 
 )

Sollte das noch zu langsam sein, könnte man
noch einen Index auf die Spalte "timestamp" legen.

VG ROlf

Bäm! Klasse, innerhalb von ner halben Sekunde war das Ergebnis da!

Super Sach! Dank Dir! 🙂
 

Neue Themen


Zurück
Oben