Ergebnis 1 bis 9 von 9

Thema: Den letzten Wert einer Tabelle anzeigen...

  1. #1
    WillyWacker ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    8

    Beitrag 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.
    Hat da jemand eine Idee oder einen Lösungsansatz?
    Bin für jede Hilfe dankbar,
    Gruß
    Will

  2. #2
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von WillyWacker Beitrag 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.
    Du suchst als max(num), produkt, datum, status gruppiert nach produkt, datum, status und sortiert nach num.

    Also schreibst du:

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

    Andreas
    Geändert von akretschmer (15.04.2008 um 12:49 Uhr)
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    WillyWacker ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    8

    Standard Danke für den Tip, Andreas, aber leider bekomme...

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

  4. #4
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von WillyWacker Beitrag anzeigen
    ...ich mit diesem Statement die gesamte Tabelle ausgegeben.
    Nein:
    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)
    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.
    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)
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  5. #5
    WillyWacker ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    8

    Standard Vielleicht hab ich mich falsch ausgedrückt, danke

    trotzdem für Deine Hilfe.

    Gruß

    Will

  6. #6
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von WillyWacker Beitrag anzeigen
    trotzdem für Deine Hilfe.

    Gruß

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

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    WillyWacker ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    8

    Standard Hallo Andreas, leider noch nciht erledigt, was aber...

    ...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|_|_

  8. #8
    akretschmer ist gerade online Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von WillyWacker Beitrag anzeigen
    ...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:

    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:

    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)
    Oder als VIEW:

    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)
    Besser so?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    WillyWacker ist offline Neuer Benutzer
    Registriert seit
    07.05.2006
    Beiträge
    8

    Standard Jaaaaa, tausend Dank, es funktioniert!!! ...

    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

Ähnliche Themen

  1. Antworten: 4
    Letzter Beitrag: 01.03.2011, 12:05
  2. Antworten: 2
    Letzter Beitrag: 19.07.2010, 13:12
  3. Antworten: 4
    Letzter Beitrag: 29.01.2008, 15:07
  4. die letzten drei zeilen der tabelle ausgeben?
    Von hatori.hanzo im Forum Allgemeines
    Antworten: 1
    Letzter Beitrag: 07.09.2007, 19:47
  5. Struktur einer Datenbank anzeigen lassen
    Von trauter im Forum Allgemeines
    Antworten: 3
    Letzter Beitrag: 18.07.2006, 21:27

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum