Hallo,
Postgresql 8.4
Ich habe eine Tabelle Zeitung, die so aussieht:
Zeitung
-------
zeitungsid (int, PK)
name (text)
-------
Und eine Tabelle Zeitungsausgabe:
ZeitungsAusgabe
------------------
ausgabeid (int, PK)
zeitungsid (int, FK)
datum (timestamp)
------------------
In dieser Tabelle werden Zeitungsausgaben (z.B. Die Ausgabe der New York Times vom 19.10.2010) gespeichert.
Inhalt der ZeitungsAusgabe Tabelle könnte dann etwa so aussehen:
ausgabeid zeitungsid datum
-----------------------------
1 1 19.10.2010
2 1 ...
3 1 ...
4 67 ...
5 67 ...
-----------------------------
Gesucht ist der SQL Befehl der von der Tabelle ZeitungsAusgabe nur die neueste Ausgabe von jeder Zeitung liefert.
Das Ergebnis des Befehls soll also so ausehen:
ausgabeid zeitungsid datum
-----------------------------
3 1 ...
5 67 ...
-----------------------------
Bestimmt ganz einfach, ich komme nur einfach nicht auf die Lösung
Danke Schonmal!
Gruß
Humppa
Hallo,
Postgresql 8.4
Ich habe eine Tabelle Zeitung, die so aussieht:
Zeitung
-------
zeitungsid (int, PK)
name (text)
-------
Und eine Tabelle Zeitungsausgabe:
ZeitungsAusgabe
------------------
ausgabeid (int, PK)
zeitungsid (int, FK)
datum (timestamp)
------------------
In dieser Tabelle werden Zeitungsausgaben (z.B. Die Ausgabe der New York Times vom 19.10.2010) gespeichert.
Inhalt der ZeitungsAusgabe Tabelle könnte dann etwa so aussehen:
ausgabeid zeitungsid datum
-----------------------------
1 1 19.10.2010
2 1 ...
3 1 ...
4 67 ...
5 67 ...
-----------------------------
Gesucht ist der SQL Befehl der von der Tabelle ZeitungsAusgabe nur die neueste Ausgabe von jeder Zeitung liefert.
Das Ergebnis des Befehls soll also so ausehen:
ausgabeid zeitungsid datum
-----------------------------
3 1 ...
5 67 ...
-----------------------------
Bestimmt ganz einfach, ich komme nur einfach nicht auf die Lösung
Danke Schonmal!
Gruß
Humppa
test=*# select * from zeitung;
zeitungid | name
-----------+------------
1 | zeitung 1
67 | zeitung 67
(2 rows)
test=*# select * from zeitungsausgabe ;
ausgabeid | zeitungid | datum
-----------+-----------+------------
1 | 1 | 2009-10-19
2 | 1 | 2009-10-20
3 | 1 | 2009-10-21
4 | 67 | 2001-01-01
5 | 67 | 2001-01-02
(5 rows)
test=*# select distinct on (zeitungid) ausgabeid, zeitung.zeitungid, datum from zeitungsausgabe left join zeitung on (zeitungsausgabe.zeitungid=zeitung.zeitungid) order by zeitungid, datum desc;
ausgabeid | zeitungid | datum
-----------+-----------+------------
3 | 1 | 2009-10-21
5 | 67 | 2001-01-02
(2 rows)
Andreas
ich verzeichne einen hohen bedarf an DISTINCT ON in letzter zeit - woran mag das liegen?
ads
21. Oktober 2009 um 12:20
5
An vermehrter Nutzung vernünftiger Datenbanken in Kombination mit anständigem Datenbankdesign.
Hehe. Ja, es ginge natürlich auch anders, aber DISTINCT ON() hat einen kleinen, aber feinen Vorteil: es ist eine PG-Erweiterung. World domination, now()!
Andreas