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.
Hat da jemand eine Idee oder einen Lösungsansatz?
Bin für jede Hilfe dankbar,
Gruß
Will
Geändert von akretschmer (15.04.2008 um 12:49 Uhr)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
...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:
Das war ohne Filterung. Es existieren in den 6 Datensätzen 5 Gruppen von Feld 'prod'.Code: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)
Klar, ich hatte auch nix gefiltert.Es wird nichts gefiltert, alle Sätze werden angezeigt.
Code: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)Wenn man es richtig [tm] macht, klappt es. Glaub mir. Vielleicht solltest Du *etwas* mehr zu SQL lernen.Auch, wenn ich das Datum oder num weglasse, also nur ein einzelnes Kriterium auswähle, habe ich das gleiche Ergebnis.
Nun ja. Aber auch [bold]damit[/bold] kann man SQL machen.Ich verwende pgAdmin III für die Abfragen.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
trotzdem für Deine Hilfe.
Gruß
Will
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
...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:
Code: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:
Oder als VIEW:Code: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)
Besser so?Code: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)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen