Den letzten Wert einer Tabelle anzeigen...

Hallo erstmal…
habe schon den ganzen vormittag vergeblich im web und in diversen Foren gesucht, vielleicht könnt Ihr mir helfen.
In einer Postgres 8.2 Umgebung habe ich eine Tabelle mit den Einträgen:

num Produkt Datum Status
1 1020 1.4.08 12:21:44:987 0
2 1030 1.4.08 12:21:45:434 0
3 1010 1.4.08 12:21:45:921 1
4 1020 1.4.08 12:21:46:323 2
5 1040 1.4.08 12:21:47:145 0
6 1030 1.4.08 12:21:47:981 1
7 1060 1.4.08 12:21:48:431 1


num= increment, Produkt=integer Datum=ts ohne zz Status=integer

Was ich nun gern hätte. wäre eine Liste der jeweils letzten Einträge
eines jeden Produkts.
Hierbei könnte die Liste nach num oder Datum sortiert sein.
Das sollte so aussehen:

num Produkt Datum Status
3 1010 1.4.08 12:21:45:921 1
4 1020 1.4.08 12:21:46:323 2
5 1040 1.4.08 12:21:47:145 0
6 1030 1.4.08 12:21:47:981 1
7 1060 1.4.08 12:21:48:431 1

Von Interesse ist also der jeweils letzte Eintrag eines jeden Produkts und dessen Status. Das feld ‘num’ brauche ich in dieser Liste nicht unbedingt.
In Access gibt es die Klausel LAST(), aber die exististiert in P-SQL und auch im Standard nicht. Mit LIMIT bin ich nicht weitergekommen. :confused:
Hat da jemand eine Idee oder einen Lösungsansatz?
Bin für jede Hilfe dankbar,
Gruß
Will

Du suchst als max(num), produkt, datum, status gruppiert nach produkt, datum, status und sortiert nach num.

Also schreibst du:

select max(num), produkt, datum, status from TABELLE group by produkt, datum, status order by 1

Andreas

…ich mit diesem Statement die gesamte Tabelle ausgegeben.
Es wird nichts gefiltert, alle Sätze werden angezeigt.
Auch, wenn ich das Datum oder num weglasse, also nur ein einzelnes Kriterium auswähle, habe ich das gleiche Ergebnis.
Ich verwende pgAdmin III für die Abfragen.

Gruß

Will

Nein:

test=*# select * from prod;
 id | prod | status
----+------+--------
  1 | 1020 |      0
  2 | 1030 |      0
  3 | 1010 |      0
  4 | 1020 |      1
  5 | 1040 |      0
  6 | 1030 |      0
(6 rows)

test=*# select max(id), prod, status from prod group by prod, status order by 1;
 max | prod | status
-----+------+--------
   1 | 1020 |      0
   3 | 1010 |      0
   4 | 1020 |      1
   5 | 1040 |      0
   6 | 1030 |      0
(5 rows)

Das war ohne Filterung. Es existieren in den 6 Datensätzen 5 Gruppen von Feld ‘prod’.

Es wird nichts gefiltert, alle Sätze werden angezeigt.

Klar, ich hatte auch nix gefiltert.

test=*# select max(id), prod, status from prod where status = 0 group by prod, status order by 1;
 max | prod | status
-----+------+--------
   1 | 1020 |      0
   3 | 1010 |      0
   5 | 1040 |      0
   6 | 1030 |      0
(4 rows)



Auch, wenn ich das Datum oder num weglasse, also nur ein einzelnes Kriterium auswähle, habe ich das gleiche Ergebnis.

Wenn man es richtig [tm] macht, klappt es. Glaub mir. Vielleicht solltest Du etwas mehr zu SQL lernen.

Ich verwende pgAdmin III für die Abfragen.

Nun ja. Aber auch [bold]damit[/bold] kann man SQL machen.

Andreas

trotzdem für Deine Hilfe.

Gruß

Will

Ich weiß nun nicht, wie ich das verstehen soll. Problem nun erledigt?

Andreas

…wohl daran gelegen hat, dass ich das Problem nicht konkret genug beschrieben habe.
Das ist mir klar geworden, als ich mir die Ergebnisse der verschiedenen Statements angesehen habe.

Ich habe einen screenshot im web hinterlegt, damit man besser sehen kann, was ich mit der Ausgabe bezwecken will. Hier nochmal eine etwas genauere Beschreibung:

Es gibt eine sog. ‘Erfassungstabelle’ mit den Feldern

num (=inkrement)
product (=varchar)
date (=timestamp without time zone)
state (=integer)

Aus dieser möchte ich gern eine ‘Ausgabetabelle’ machen, wie nachstehend beschrieben.
Ein Bild zu beiden Tabellen habe ich hier gespeichert:
http://www.pedru.de/tabelle.jpg

In der Erfassungstabelle werden Produkte der Reihe nach
erfasst und mit einem bestimmten Status (state) gespeichert.
Manche Produkte werden mehrfach erfasst, dabei kann ‘state’ jeweils unterschiedlich sein.
Jedes neu in dieser Tabelle eingetragene Produkt erhält eine fortlaufende id (num), die ist auch gleichzeitig der primary key.

Die Ausgabetabelle soll nun alle geprüften Produkte enthalten,
nach Produktnummer (product) sortiert.
Das Feld ‘num’ ist hierbei nicht unbedingt erforderlich, aber
die Felder ‘date’ und ‘state’ sind wichtig.

Bei Produkten, die in der Erfassungstabelle mehrfach vorkommen, soll der
jeweils letzte Eintrag des Produkts verwendet werden.
Das soll sicherstellen, dass in der Ausgabetabelle immer der letzte Stand (bzw. Status) eines jeden Produkts auftaucht.

Im Bild kann man die Anordnung sehen:
Produkt 1010 kommt in der ersten Zeile vor, und ein weiteres mal
in der 6. Zeile.
Der Eintrag in der 6. Zeile soll dann in der Ausgabetabelle erscheinen,
weil er der letzte des Produkts 1010 in der Erfassungstabelle ist.
Das gleiche gilt für Produkt 1020.

Vielleicht ist das jetzt etwas verständlicher, falls Dir oder jemand anderem dazu noch etwas einfällt, würde ich mich über eine Antwort freuen.

Viele Grüße

Wi||

Bilder sind extrem suboptimal, weil man nicht via Copy&Paste gleich die Tabellen erstellen und füllen kann.

Ich hab mal eine Tabelle erstellt, mit 4 Deiner Zeilen:

test=*# select * from prod;
 num | product |        datum        | state
-----+---------+---------------------+-------
   1 |    1010 | 0006-09-29 13:43:12 |     1
   2 |    1020 | 0006-09-29 13:43:13 |     0
   6 |    1010 | 0006-09-29 13:43:17 |     0
  13 |    1020 | 0006-09-29 13:43:17 |     1
(4 rows)

Dazu ein Select:

test=*# select * from prod where (num, product) in (select max(num), product from prod group by product);
 num | product |        datum        | state
-----+---------+---------------------+-------
   6 |    1010 | 0006-09-29 13:43:17 |     0
  13 |    1020 | 0006-09-29 13:43:17 |     1
(2 rows)

Oder als VIEW:

test=*# create view my_view as select * from prod where (num, product) in (select max(num), product from prod group by product);
CREATE VIEW
test=*# select * from my_view ;
 num | product |        datum        | state
-----+---------+---------------------+-------
   6 |    1010 | 0006-09-29 13:43:17 |     0
  13 |    1020 | 0006-09-29 13:43:17 |     1
(2 rows)

Besser so?

Andreas

:slight_smile: konnte es gestern leider nicht mehr testen, aber gerade hab ich es ausprobiert. Das ist genau das, was ich gemeint hab.
Vielen Dank nochmal, jetzt komme ich weiter.
Gruß

WiLL