Datensätze gruppieren

PetraSteiner

Fleissiger Benutzer
Beiträge
60
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

  • beispiel.txt
    834 Bytes · Aufrufe: 2
Werbung:
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:
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.
 
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:
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 :)
 
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;
 
Werbung:
Zurück
Oben