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

Anfängerfrage: zeige letzten Stand verschiedener Positionen

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Abcoris, 16 April 2013.

  1. Abcoris

    Abcoris Neuer Benutzer

    Hallo allerseits

    habe gerade mit MySQL begonnen und stehe vor einem Problem, wo ich nicht weiter komme.
    Gegeben ist eine Tabelle, etwa wie

    timestamp Pos Anzahl
    2013-01-01 1 15
    2013-01-02 2 10
    2013-01-01 3 20
    2013-01-04 4 25
    2013-02-08 2 14
    2013-02-02 4 22
    2013-03-09 3 21
    2013-04-15 4 23
    2013-04-02 1 14
    2013-04-15 1 16

    Nun suche ich einen Befehl, der mir den Stand aller Pos zu einem bestimmten Zeitpunkt angibt, z.B. where timestamp <= 2013-04-02.

    Als Ergebnis soll der letzte Stand jeder Position angezeigt werden, wie z.B.:

    timestamp Pos Anzahl
    2013-04-02 1 14
    2013-02-08 2 14
    2013-03-09 3 21
    2013-02-02 4 22

    Habt Ihr eine Idee, wie ich das angehen kann? Danke.

    Gruss
    Abcoris
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Gewöhn dich dran, bei MySQL ;-)

    Du ermittelst erst einmal die Kombinationen von timestamp und pos, die relevant sind. Meine Tabelle hat andere Spaltennamen, ansonsten gleich:

    Code:
    test=*# select * from abcoris ;
        d      | id | val
    ------------+----+-----
    2013-01-01 |  1 |  15
    2013-01-02 |  2 |  10
    2013-02-01 |  3 |  20
    2013-01-04 |  4 |  25
    2013-02-08 |  2 |  14
    2013-02-02 |  4 |  22
    2013-03-09 |  3 |  21
    2013-04-15 |  4 |  23
    2013-04-02 |  1 |  14
    2013-04-15 |  1 |  16
    (10 rows)
     
    Time: 0,169 ms
    test=*# select max(d), id from abcoris where d <= '2013-04-02' group by id;
        max    | id
    ------------+----
    2013-03-09 |  3
    2013-02-02 |  4
    2013-04-02 |  1
    2013-02-08 |  2
    (4 rows)
    
    Das verwendest dann im Subselect weiter:

    Code:
    test=*# select * from abcoris where (d, id) in (select max(d), id from abcoris where d <= '2013-04-02' group by id);
        d      | id | val
    ------------+----+-----
    2013-02-08 |  2 |  14
    2013-02-02 |  4 |  22
    2013-03-09 |  3 |  21
    2013-04-02 |  1 |  14
    (4 rows)
    
    Einfacher ginge es so:

    Code:
    test=*# select distinct on(id) d, id, val from abcoris where d <= '2013-04-02' order by id,d desc;
        d      | id | val
    ------------+----+-----
    2013-04-02 |  1 |  14
    2013-02-08 |  2 |  14
    2013-03-09 |  3 |  21
    2013-02-02 |  4 |  22
    (4 rows)
    
    Das kann MySQL aber nicht.


    Andreas
     
  3. Abcoris

    Abcoris Neuer Benutzer

    Hallo Andreas,

    passt prima. Vielen Dank für die schnelle, kompetente Hilfe.

    Gruss
    Abcoris
     
Die Seite wird geladen...

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