mehrere GROUP Kriterien

mehrere GROUP Kriterien

am 20.12.2005 01:16:47 von Mark Knochen

Hallo,

ich habe eine Kurs-Tabelle mit z.B.

ID, AktienID, Kursdatum, Kurs

Nun möchte ich alle Aktien, jeweils nur einmal, immer mit dem
aktuellsten Kurs.


"SELECT * FROM tabelle GROUP BY AktienID ORDER BY Kursdatum DESC"

Das klappt nicht, weil so unter Umständen der aktuellste Kurs schon
der Gruppierung "zum Opfer" gefallen ist.

Ansonsten würde ich das GROUP BY weglassen und mir mit PHP eine
Lösung basteln, die doppelte AktienID filtert, aber das will ich
eigentlich nicht.

Mark

Re: mehrere GROUP Kriterien

am 20.12.2005 08:34:09 von Andreas Kretschmer

Andreas
--
Andreas Kretschmer
Linux - weil ich es mir wert bin!
GnuPG-ID 0x3FFF606C http://wwwkeys.de.pgp.net

Re: mehrere GROUP Kriterien

am 20.12.2005 10:37:53 von Dominik Echterbruch

Andreas Kretschmer wrote:
>>
>>ich habe eine Kurs-Tabelle mit z.B.
>
> test=# select * from kurs;
> id | aktien_id | kursdatum | kurs
> ----+-----------+------------+------
> 1 | 1 | 2005-12-01 | 100
> 2 | 1 | 2005-12-02 | 110
> 3 | 1 | 2005-12-03 | 120
> 4 | 4 | 2005-12-03 | 4000
> 5 | 4 | 2005-12-04 | 3000
> (5 rows)
>
>>Nun möchte ich alle Aktien, jeweils nur einmal, immer mit dem
>>aktuellsten Kurs.
>
> test=# select id, aktien_id, kurs from kurs where (aktien_id,kursdatum)
> in (select aktien_id, max(kursdatum) from kurs group by aktien_id);
> id | aktien_id | kurs
> ----+-----------+------
> 3 | 1 | 120
> 5 | 4 | 3000
> (2 rows)
>
> Obige Syntax ist PostgreSQL, sollte mit MySQL aber sicher auch gehen.

SELECT a.* FROM kurs a
LEFT JOIN kurs b ON a.aktien_id = b.aktien_id
AND a.kursdatum < b.kursdatum
WHERE b.kursdatum IS NULL;

funktioniert genauso gut und hat den Vorteil, daß es auch unter MySQL
kleiner 4.1 läuft. Übrigens geht das auch mit PostgreSQL :)

>>Ansonsten würde ich das GROUP BY weglassen und mir mit PHP eine
>>Lösung basteln, die doppelte AktienID filtert, aber das will ich
>>eigentlich nicht.
>
> Eine Lösung mit PHP wäre ganz sicher um Größenordnungen lahmer.

ACK.

> Aufpassen mußt Du, falls für eine aktien_id und ein kursdatum mehrere
> Einträge esistieren, ein Unique Index auf (aktien_id, kursdatum) würde
> dies aber verhindern.

Im Zweifelsfall einfach den Timestamp speichern, statt nur einem Datum.
Dann greifen wieder beide Algorithmen problemlos.


Grüße,
Dominik
--
MonstersGame - Die Schlacht zwischen Vampiren und Werwölfen
http://spielwelt6.monstersgame.net/?ac=vid&vid=3018786