# Den letzten Wert einer Tabelle anzeigen...

**URL:** https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146
**Category:** SQL
**Created:** [15. April 2008 um 10:23 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146 "2008-04-15T10:23:47Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![anon57134295](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/9fc29f/32.png) [@anon57134295](https://www.pg-forum.de/u/anon57134295)
#### Post date: [15. April 2008 um 10:23 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/1 "2008-04-15T10:23:47Z")

</div>

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:](https://www.pg-forum.de/uploads/default/original/1X/2de57563fce1c161bdd76f6ef65cd5db07f74914.png "verwirrt")  
Hat da jemand eine Idee oder einen Lösungsansatz?  
Bin für jede Hilfe dankbar,  
Gruß  
Will

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [15. April 2008 um 10:46 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/2 "2008-04-15T10:46:30Z")

</div>

> [@WillyWacker](#):
>
> 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.

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

Also schreibst du:

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

```

Andreas

---

<div class="post-metadata">

### Author: ![anon57134295](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/9fc29f/32.png) [@anon57134295](https://www.pg-forum.de/u/anon57134295)
#### Post date: [15. April 2008 um 11:29 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/3 "2008-04-15T11:29:38Z")

</div>

…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

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [15. April 2008 um 11:40 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/4 "2008-04-15T11:40:59Z")

</div>

> [@WillyWacker](#):
>
> …ich mit diesem Statement die gesamte Tabelle ausgegeben.

Nein:

```plaintext
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.

```plaintext
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

---

<div class="post-metadata">

### Author: ![anon57134295](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/9fc29f/32.png) [@anon57134295](https://www.pg-forum.de/u/anon57134295)
#### Post date: [15. April 2008 um 12:24 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/5 "2008-04-15T12:24:41Z")

</div>

trotzdem für Deine Hilfe.

Gruß

Will

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [15. April 2008 um 12:28 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/6 "2008-04-15T12:28:37Z")

</div>

> [@WillyWacker](#):
>
> trotzdem für Deine Hilfe.
> 
> Gruß
> 
> Will

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

Andreas

---

<div class="post-metadata">

### Author: ![anon57134295](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/9fc29f/32.png) [@anon57134295](https://www.pg-forum.de/u/anon57134295)
#### Post date: [15. April 2008 um 13:25 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/7 "2008-04-15T13:25:40Z")

</div>

…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](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|_|_

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [15. April 2008 um 14:11 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/8 "2008-04-15T14:11:43Z")

</div>

> [@WillyWacker](#):
>
> …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:

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:

```plaintext
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:

```plaintext
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:

```plaintext
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

---

<div class="post-metadata">

### Author: ![anon57134295](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/9fc29f/32.png) [@anon57134295](https://www.pg-forum.de/u/anon57134295)
#### Post date: [16. April 2008 um 05:35 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/9 "2008-04-16T05:35:04Z")

</div>

🙂 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

---

<div class="post-metadata">

### Author: ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)
#### Post date: [21. Februar 2021 um 07:07 UTC](https://www.pg-forum.de/t/den-letzten-wert-einer-tabelle-anzeigen/3146/10 "2021-02-21T07:07:34Z")

</div>


