Frühere Kosten eines Objekts abrufen

jetwork

Fleissiger Benutzer
Beiträge
97
Hallo Zusammen,

ich habe die folgende Tabelle:

upload_2015-11-11_21-44-10.png

Wie viele kostete Birne und Apfel am 2015-11-10 um 12:00:00 und wie viel kosten sie aktuell?

Ich beschäftige mich seit Stunden mit diesen Abfragen. Ich konnte aber leider noch keine Lösung finden.

Eigentlich habe ich mehr als 2 Produkte. Könnt ihr eine algemeinere Abfrage schreiben.
Ich möchte die Kosten alle meiner produkte mit verschiedene "objekt_id"s an einem bestimmten Zeitpunkt abfragen.

Kann jemand mir bitte die Abfragen schreiben.



Danke im Voraus
 
Zuletzt bearbeitet:
Werbung:
Kann sein, daß folgendes nicht in MySQL geht:

Code:
test=*# select * from obst ;
 id | o_id | name  | cost |  added_time
----+------+-------+------+---------------------
  1 |  1 | apfel |  199 | 2015-11-09 10:00:00
  2 |  2 | birne |  299 | 2015-11-09 10:00:00
  3 |  2 | birne |  399 | 2015-11-10 10:00:00
  4 |  2 | birne |  499 | 2015-11-11 21:32:24
(4 rows)

test=*# select name, cost from (select *, coalesce(lead(added_time) over (partition by o_id order by added_time),'infinity') as end_time  from obst ) preise where now() between added_time and end_time;
 name  | cost
-------+------
 apfel |  199
 birne |  499
(2 rows)

test=*# select name, cost from (select *, coalesce(lead(added_time) over (partition by o_id order by added_time),'infinity') as end_time  from obst ) preise where now() between added_time and end_time;
 name  | cost
-------+------
 apfel |  199
 birne |  499
(2 rows)

Ja, wird nicht gehen, da ich window-functions nutze. Pech für MySQL-User :-(
 
Code:
SELECT    tabelle.*
FROM    (

SELECT    object_id,
        max(added_time) AS added_time
FROM    tabelle
WHERE    added_time <= '2015-25-09 14:05:07.013'
GROUP BY object_id

        ) t
INNER JOIN tabelle
ON        t.object_id = tabelle.object_id
AND        t.added_time = tabelle.added_time
 
Vielen Dank. @ukulele s abfrage hat sehr gut funktioniert.
Ich musste aber noch ein fall abdecken. Was wäre wenn ein Produkt nicht mehr existiert??. Deswegen habe ich noch eine Spalte hinzugefügt.
Wenn ein Produkt nicht mehr existiert muss ich noch einen leeren Eintrag nur mit „Object_id“ und „Deleted“ Spalte hinzufügen.

upload_2015-11-12_10-55-53.png
Code:
SELECT  tbl_test.*
FROM  (
SELECT  object_id, max(added_time) AS added_time
FROM  tbl_test
WHERE  added_time <= '2015-11-12 9:00:00'
GROUP BY object_id
  ) t
INNER JOIN tbl_test
ON  t.object_id = tbl_test.object_id AND t.added_time = tbl_test.added_time
WHERE   deleted != 1
Macht man so oder kennt ihr eine bessere Lösung?
 
Ja Performance ist so eine Sache. Wenn man aber zu einem GROUP BY Daten dazu holen will und nicht mit max() min() sum() oder coalesce() arbeiten kann dann muss man ja schon erneut auf den GROUP BY joinen. Ein clustered index auf object_id und added_time wäre aber bestimmt von Nutzen.

Das mit der deleted Spalte würde ich nicht so machen. Wenn man es schon über eine deleted Spalte löst sollte die dem object, auf das die object_id verweisst, zugeordnet sein. Das ist zwar für die Abfrage nicht so vorteilhaft weil du auch noch die object Tabelle joinen musst aber dennoch deutlich logischer.
 
Das mit der deleted Spalte würde ich nicht so machen. Wenn man es schon über eine deleted Spalte löst sollte die dem object, auf das die object_id verweisst, zugeordnet sein. Das ist zwar für die Abfrage nicht so vorteilhaft weil du auch noch die object Tabelle joinen musst aber dennoch deutlich logischer.

In meinem Fall möchte ich eigentlich keine Objekt-Preise speichern. Es gibt keine andere Objekt-Tabelle. Mir reicht nur eine Tabelle.

Ich habe in der Regel Objekte und die Objekte haben mehr als 20 verschiedene Eigenschaften(Spalten). Die Eigenschaften dieser Objekte sollen in der Regel nicht sehr oft geändert werde. Es kommen aber Fälle, dass die Eigenschaften falsch waren und korrigiert werden müssen oder dieses Objekt nicht mehr in der Liste ist. In diesen Fällen werde ich über einen neuen Rekord die Eigenschaften korrigieren bzw. einen leeren Eintrag nur mit „Objekt_id“ und „Deleted“ hinzufügen. Ich kann die existierenden Einträge nicht modifizieren weil ich früheren Stand dieser Tabelle irgendwann mal wieder brauchen kann.

Wenn ich die „deleted“-Spalte in einer neuen Tabelle hinzufügen soll, dann werde ich in dieser neuen Tabelle nur eine Spalte namens „deleted_id“ haben. Soll ich das trotzdem in einer neuen Tabelle speichern?
 
Werbung:
Verstehe ich nicht ganz aber am Ende musst du entscheiden welcher Weg besser ist. Ich kann nicht beurteilen ob Preise eventuell mal wieder gültig werden nachdem sie mal ungültig waren etc.
 
Zurück
Oben