Gruppierung !?

Hallo zusammen,
ich möchte aus der Tabelle ‘Preise’ (skizziert dargestellt) …

Artikel Preis gueltig_ab
123 1.20 01.01.2008
123 1.45 15.01.2008
456 7.50 01.01.2008

… nur die Zeile 2 und 3 (komplett) erhalten. (Da Zeile 1 nicht mehr gültig ist.)

Kann mir jemand bei der SQL-Abfrage helfen. Ich habe schon viel rumprobiert.
Danke & Gruß



test=*# select * from preise;
 id | preis |  gueltig
----+-------+------------
  1 |    10 | 2008-01-19
  1 |    20 | 2008-01-29
  2 |    22 | 2008-01-29
(3 rows)

test=*# select id, preis, gueltig from preise where (id, gueltig) in (select id, max(gueltig) from preise group by id);
 id | preis |  gueltig
----+-------+------------
  1 |    20 | 2008-01-29
  2 |    22 | 2008-01-29
(2 rows)

Andreas

Super! Danke! Funktioniert unter PostgreSQL einwandfrei!

Leider per ODBC auf eine PROGRESS!-Datenbank (für ERP-System proAlpha) nicht.
Die akzeptiert wohl keine mehrfachen Felder beim IN-Vergleich.
(PostgreSQL ist hald unschlagbar. :slight_smile: )

Gibt es eine alternative Lösung? (Wenn nicht - Danke trotzdem!)

Mir fällt da noch was ein:

test=*# select distinct on (id) id, preis, gueltig from preise order by id, gueltig desc;
 id | preis |  gueltig
----+-------+------------
  1 |    20 | 2008-01-29
  2 |    22 | 2008-01-29

Das ist aber erst recht PG-spezifisch. Möglicherweise gibt es ja für die andere DB auch ein Forum oder Mailingliste oder sowas…

Andreas

Hat unter PostgreSQL auch super funktioniert.

Unter PROGRESS!/ODBC leider nicht - wie du richtig vermutet hast.

Dieses Forum und die User sind echt KLASSE !!!

Meine erste Lösung ist IMHO ganz klares SQL. Die zweite Lösung mit dem DISTINCT ON ist eine Erweiterung von PostgreSQL gegenüber dem SQL-Standard und auch so in der Doku dokumentiert. Im übigen ist auch LIMIT kein Standard.

Dieses Forum und die User sind echt KLASSE !!!

Bedanke Dich bei den Machern von PostgreSQL für das super Produkt. Du wirst für ein x-beliebiges Dreckstool ganz sicher kein brauchbares Forum finden. Ursache -> Wirkung.

Andreas

SELECT n.artikel, n.preis, n.gueltig_ab
FROM news n
WHERE NOT EXISTS (SELECT * FROM news i WHERE i.gueltig_ab > n.gueltig_ab AND i.artikel=n.artikel);