Anfängerfrage: zeige letzten Stand verschiedener Positionen

Abcoris

Neuer Benutzer
Beiträge
2
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.731
Hallo allerseits

habe gerade mit MySQL begonnen und stehe vor einem Problem, wo ich nicht weiter komme.

Gewöhn dich dran, bei MySQL ;-)

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.

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
 
Werbung:
Oben