Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Datensätze gruppieren

Dieses Thema im Forum "PostgreSQL" wurde erstellt von PetraSteiner, 29 Mai 2020.

  1. PetraSteiner

    PetraSteiner Aktiver Benutzer

    Hallo,
    ich habe eine Beispieldatenbank erstellt. Ich habe folgendes Problem:
    Manche Artikel haben mehrere Datensätze. Ich benötige am Ende nur Einzelwerte.

    Das wäre eigentlich der Select, der mir die gewünschte Artikel liefert.
    Code:
    SELECT artikelnummer, artikel, max(gueltig_bis)
    FROM artikel
    GROUP by artikelnummer, artikel
    Problem dabei: Ich darf die anderen Spaltenwerte nicht verlieren. Sobald ich z.B. die id hinzufüge,
    sind die datensätze nicht mehr eindeutig.
    Kann man das irgendwie lösen?


    Hier wären noch die Beispieldaten:
    Code:
    artikelnummer    artikel    von    bis    groesse    bef    id    liefer    gueltig_bis
     123123    Oberhemd    2020-01-01    2020-03-20    12    12    DE-13213    1    2020-03-20
     123124    Mantel        1999-01-01    NULL    4    9    DE-13214    2    2099-12-31
     123125    Hose    1999-01-01    1999-12-31    9    2    DE-13215    7    1999-12-31
     123123    Oberhemd    2020-02-01    NULL    12    12    DE-132132    4    2020-04-05
     123125    Hose    2020-01-01    NULL    9    2    DE-132153    7    2099-12-31
    
    

    Viele Grüße
    Petra
     

    Anhänge:

  2. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    eine ID hat eigentlich den Sinn, etwas eindeutig zu machen.

    welche Spalten willst du selecten?

    was willst du von den Spalten selecten? (max, min, avg, etc.)

    EDIT: es ist gängig, dass die ID eigentlich immer die erste Spalte ist.

    EDIT2: habe dein Beispiel mal 1:1 so in den PGAdmin geschrieben, und ich sehe am Ende 3 Datensätze, die schön gruppiert sind.

    EDIT3: auf meinem Weg hat es sich meist ausgezahlt, möglichst viele Tabellen zu erstellen, diese per Foreign Keys verknüpfen, und für stored selects views anlegen.

    EDIT4: Erzähl uns ein bisschen, von deinem eigentlichem vorhaben, sinn und zweck deiner Datenbank.
     
    Zuletzt bearbeitet: 29 Mai 2020
  3. PetraSteiner

    PetraSteiner Aktiver Benutzer

    Danke, dass Du dir Zeit genommen hast. Ich habe auf die schnelle ein Minimal-Beispiel gefricket. Auf die ID habe ich jetzt nicht expliziert geachtet.
    Wenn ich jetzt den Select

    Code:
    SELECT id, artikelnummer, artikel, max(gueltig_bis)
    FROM artikel
    GROUP by artikelnummer, artikel, id
    verwende, sind die Artikel nicht mehr eindeutig.

    Folgender Select wäre falsch:
    Code:
    SELECT max(id), artikelnummer, artikel, max(gueltig_bis)
    FROM artikel
    GROUP by artikelnummer, artikel
    Die Artikel sind zwar eindeutig aber er zieht den Max-Wert von ID und Max von gueltig_bis.
    Er mixed das. Das darf in meinem Fall nicht sein.
    Hoffe so versteht man mein Problem besser.
     
  4. Kampfgummibaerlie

    Kampfgummibaerlie Datenbank-Guru

    lass einfach mal die ID raus ;)

    EDIT: die ID darf weder den Max-Wert selecten (gibt nur 1 Datensatz), noch in Group by vorhanden sein (gibt alle Werte wieder).

    EDIT2: sorry, erster Edit ist halb richtig, die IDs werden ja gruppiert nach dem Artikelnamen...

    Anhang:
    Schreib einfach mal ausdauernd dein ganzes Problem, ich denke, du baust bereits die Basis falsch auf ^^
     
    Zuletzt bearbeitet: 29 Mai 2020
  5. PetraSteiner

    PetraSteiner Aktiver Benutzer

    Ich weiß nicht wie ich es besser erklären soll. Die Daten sind so aufgebaut.
    Die ID brauche ich auch zum weiterarbeiten.
    Vielleicht brauch ich da einen Subselect. Morgen ist auch noch ein tag :)
     
  6. castorp

    castorp Datenbank-Guru

    Offensichtlich willst Du Datensatz mit dem neuest "gueltig_bis".

    Das kann man entweder mittels Window Funktionen machen:

    Code:
    SELECT artikelnummer, artikel, gueltig_bis
    from (
      SELECT artikelnummer, artikel, gueltig_bis,
             max(gueltig_bis) over (partition by artikelnummer, artikel) as max_gueltig_bis
      FROM artikel
    ) t
    where gueltig_bis = max_gueltig_bis;
    
    Postgres hat aber eine sehr nette Erweiturung zum DISTINCT Operator, nämlich DISTINCT ON, was typischerweise schneller ist:

    Code:
    SELECT distinct on (artikelnummer, artikel) artikelnummer, artikel, gueltig_bis
    FROM artikel
    ORDER BY artikelnummer, artikel, gueltig_bis desc;
     
    PetraSteiner gefällt das.
  7. PetraSteiner

    PetraSteiner Aktiver Benutzer

    Vielen Dank. Der Select bringt mich weiter.
    Wieder etwas wichtiges gelernt: Window Funktionen :)
     
    akretschmer gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden