SQL Zwei Spalten - Abfrage der Zweilen mit max Wert aus Spalte2

CuNoah

Cadet 4th Year
Dabei seit
Aug. 2009
Beiträge
69
Hallo zusammen,

habe hier einen Fall, bei dem ich gerade nicht weiterkomme. Wir haben eine Tabelle mit mehreren Spalten, wichtig ist in meinem Fall Spalte1 mit einer Artikel-Nr. und Spalte2 mit der Revision.

Spalte1 | Spalte2
Artikel A | 1
Artikel A | 2
Artikel B | 1

Gibt es hier eine Möglichkeit, dass ich nur die Zeilen mit der jeweils höchsten Revison (Wert in Spalte2) pro Artikel angezeigt bekomme?

Danke
 
M

Marguth

Gast
Was du suchst ist die MAX Funktion + Groupby auf spalte 1.
Ein wenig mehr Eigenleistung wäre angebracht.
 
Zuletzt von einem Moderator bearbeitet:

CuNoah

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
69
Danke für den Hinweis mit group by :), so klappt es: select Spalte1, max (Spalte2) from Tabelle group by Spalte1.

Nächster Schritt wäre jetzt das ganze in ein Delete Statement zu ändern, also damit nur die jeweils höchste Revision pro Artikel in der Tabelle bleibt. Mag mir da noch jemand nen Tipp geben.
 
Zuletzt bearbeitet:

CuNoah

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
69
Hallo Madman1209,

leider bekomme ich bei meiner Abfrage keinen eindeutigen Spaltenwert pro Zeile, also es gibt da keinen Primärschlüssel. Ich müsste die Auswahl anhand von zwei Spalten einschränken und da scheitert es gerade dran.
 

Madman1209

Fleet Admiral
Dabei seit
Nov. 2010
Beiträge
24.755
Hi,

dann bitte konkreter werden und Beispieldaten liefern. Wenn es abstrakt wegen den Werten scheitert nutzt es wenig, wenn wir jede Einschränkung erst nach und nach erfahren.

Bitte einfach ganz klar und deutlich und eindeutig die Anforderungen beschreiben. Sonst schreiben wir den nächsten Vorschlag, der sich auch wieder nicht umsetzen lässt und verschwenden nur Zeit.

VG,
Mad
 

tm0975

Captain
Dabei seit
Juli 2010
Beiträge
3.195
bevor man ein delete verwendet, solte man evtl. mit nem flag dafür in einer separaten spate arbeiten. ansonsten ist die group by mit max variante schon das, wonach du ursprünglich gefragt hattest.
 

CuNoah

Cadet 4th Year
Ersteller dieses Themas
Dabei seit
Aug. 2009
Beiträge
69
Sorry, hätte ich oben schon genauer erklären sollen, die weiteren Spalten sind nur Textfelder, die den jeweiligen Artikel noch genauer beschreiben.
Ich habe also ein Ergebnis mit zwei Spalten, die entsprechenden Zeilen dazu sollen Nicht aus der Tabelle gelöscht werden. Auf den Aufbau der Tabelle habe ich leider keinen Einfluss :(

Spalte1 | Spalte2
Artikel A | 1
Artikel A | 2
Artikel B | 1
 

mambokurt

Commander
Dabei seit
Aug. 2011
Beiträge
2.128
Wird so wie du das willst wahrscheinlich nicht klappen, AFAIR erlaubt MySQL keine Updates/Deletes auf Tabellen, die man wiederum in einem Subselect anspricht.

Mir fallen spontan zwei Varianten ein:
http://dev.mysql.com/doc/refman/5.7/en/create-table-select.html
Also du selektierst die Daten in eine temproräre Tabelle, gleich mit dem Group By, schaust dir da die Daten in Ruhe an, schmeißt dann die Originaltabelle weg und kopierst alle Daten der temporären auf die selbe Art wieder in die Originale.

Oder:
Code:
SELECT spalte1, spalte2 FROM TABELLE tab1 WHERE EXISTS (SELECT 1 FROM TABELLE tab2 WHERE tab1.spalte1 = tab2.spalte1 AND tab1.spalte2 < tab2.spalte2)
-> sollte theoretisch alle Spalte ngeben, in denen die Revisionsnummer nicht maximal ist, dann kann man mit
Code:
SELECT CONCAT('DELETE FROM TABELLE WHERE spalte1 = ', spalte1, ' AND spalte2 = ', spalte2, ';') FROM TABELLE tab1 WHERE EXISTS (SELECT 1 FROM TABELLE tab2 WHERE tab1.spalte1 = tab2.spalte1 AND tab1.spalte2 < tab2.spalte2)
einzelne DELETE Statements zusammenhängen, du kriegst dann so viele DELETE Statements wie zu löschende Zeilen in der Tabelle sind, die kannst du dann in einem Schwups mit Copy & Paste ausführen.
 
Top