Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Frühere Kosten eines Objekts abrufen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von jetwork, 11 November 2015.

  1. jetwork

    jetwork Fleissiger Benutzer

    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: 11 November 2015
  2. akretschmer

    akretschmer Datenbank-Guru

    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 :-(
     
  3. akretschmer

    akretschmer Datenbank-Guru

    Copy&Paste - Fehler, ich frage oben 2 mal auf now() ab. Es funktioniert aber richtig, könnt ihr mir glauben ;-)
     
  4. ukulele

    ukulele Datenbank-Guru

    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
     
  5. jetwork

    jetwork Fleissiger Benutzer

    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?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    In der Tat knifflig zusammengestrickt. Ich mag aber nicht wissen wollen, die die Performance bei etwas größeren Tabellen aussieht ...
     
  7. ukulele

    ukulele Datenbank-Guru

    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.
     
  8. jetwork

    jetwork Fleissiger Benutzer

    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?
     
  9. ukulele

    ukulele Datenbank-Guru

    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.
     
Die Seite wird geladen...
Ähnliche Themen - Frühere Kosten eines
  1. PetraSteiner
    Antworten:
    7
    Aufrufe:
    1.382
  2. Tscheche
    Antworten:
    6
    Aufrufe:
    2.349
  3. Kampfgummibaerlie
    Antworten:
    0
    Aufrufe:
    1.484
  4. kero244
    Antworten:
    5
    Aufrufe:
    1.077

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden