Ankündigung

Einklappen
Keine Ankündigung bisher.

(SQL)Berechnung der Distanz von 2 Datumsfeldern aus Tabelle

Einklappen

Neue Werbung 2019

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

  • (SQL)Berechnung der Distanz von 2 Datumsfeldern aus Tabelle

    Hallo,

    ich stehe vor einem kleinen Problem und hoffe Ihr habt eine Idee:
    ich habe eine Tabelle in der jeder Datensatz ein Materialstück darstellt. Dort wird jeder Erzeugungszeitpunkt an Aggregat 1-xx mit Zeitstempeln geloggt. Ich brauche nun einen Befehl um die Distanz zwischen 2 Aggregaten zu ermitteln, genauer gesagt: Aggregat xx - direkter Vorgänger. Also wäre es im Grunde nötig den nächst jüngsten Zeitstempel unter den Erzeugungszeitpunkten zu finden.
    Dabei sind die Aggregate nicht linear aufgebaut: es kann sein das 1 Stück nur das 1. und das letzte Aggregat durchlaufen hat.

    Hat jemand eine Idee?


  • #2
    Zitat von shellycooper Beitrag anzeigen
    Hallo,

    ich stehe vor einem kleinen Problem und hoffe Ihr habt eine Idee:
    ich habe eine Tabelle in der jeder Datensatz ein Materialstück darstellt. Dort wird jeder Erzeugungszeitpunkt an Aggregat 1-xx mit Zeitstempeln geloggt. Ich brauche nun einen Befehl um die Distanz zwischen 2 Aggregaten zu ermitteln, genauer gesagt: Aggregat xx - direkter Vorgänger. Also wäre es im Grunde nötig den nächst jüngsten Zeitstempel unter den Erzeugungszeitpunkten zu finden.
    Dabei sind die Aggregate nicht linear aufgebaut: es kann sein das 1 Stück nur das 1. und das letzte Aggregat durchlaufen hat.

    Hat jemand eine Idee?
    Dafür gibt es die Funktion lag().

    Code:
    test=*# insert into shellycooper select s, random() * 1000 from generate_series(1,5) s;
    INSERT 0 5
    Time: 12,073 ms
    test=*# select * from shellycooper ;
     id |       val
    ----+------------------
      1 | 179.137851577252
      2 | 594.687966164201
      3 | 598.713165149093
      4 | 419.569856952876
      5 | 721.705469768494
    (5 rows)
    
    Time: 0,216 ms
    test=*# select *, lag(val) over (order by id) from shellycooper ;
     id |       val        |       lag
    ----+------------------+------------------
      1 | 179.137851577252 |
      2 | 594.687966164201 | 179.137851577252
      3 | 598.713165149093 | 594.687966164201
      4 | 419.569856952876 | 598.713165149093
      5 | 721.705469768494 | 419.569856952876
    (5 rows)
    
    Time: 22,085 ms
    test=*# select *, val-lag from (select *, lag(val) over (order by id) from shellycooper) foo ;
     id |       val        |       lag        |     ?column?
    ----+------------------+------------------+-------------------
      1 | 179.137851577252 |                  |
      2 | 594.687966164201 | 179.137851577252 |  415.550114586949
      3 | 598.713165149093 | 594.687966164201 |  4.02519898489118
      4 | 419.569856952876 | 598.713165149093 | -179.143308196217
      5 | 721.705469768494 | 419.569856952876 |  302.135612815619
    (5 rows)
    
    Time: 0,386 ms
    PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

    Kommentar


    • #3
      Danke schon mal für die schnelle Antwort. Das Problem ist jetzt aber das die Zeitstempel in unterschiedlichen Spalten sind:

      ein Datensatz ist in etwa so aufgebaut(Felder): Stück_id, Aggregat_1, Datum_Agg_1, Aggregat_2, Datum_Agg_2 usw.

      Eine Zeile enthält bis zu 20 Aggregate und es gilt den direkten Vorgänger innerhalb der Zeile von z.B. Aggregat 20 zu finden (der Aggregat 1 oder 5 sein kann, je nach Fertigungsweg)

      Kommentar


      • #4
        Kannst du die Tabellenstruktur nicht verändern? So wie die jetzt aufgebaut ist, ist das nicht richtig normiert. Es wäre nach meiner Meinung besser:
        Code:
        Tabelle 1 -> t_aggregatestamm
        id as int
        name as varchar
        
        Tabelle 2 -> t_artikel
        id as int
        name as varchar
        
        Tabelle 3 -> Zeitstempel
        id
        id_stueck -> Fremdschlüssel auf die t_artikel
        id_aggr -> Fremdschlüssel auf die t_aggregatestamm
        timestamp -> Zeitstempel
        Dann kann man vernünftig sortieren und wie oben beschrieben auswerten. Wenn du dann unbedingt die Auswertung brauchst mit den einzelnen Aggregaten in den Spalten, dann hilft die Pivotfunktion weiter.

        Kommentar

        Lädt...
        X