SQL Query zur Entfernung von Duplikaten (schwierig)

maddobs

Neuer Benutzer
Beiträge
4
Hallo zusammen, danke für die Aufnahme und bitte entschuldigt gleich mal, wenn ich ein paar vermeintlich blöde Fragen stelle. Sollte ich im falschen Thema sein, bitte verschieben.

Ich habe eine Datenbank mit Autodaten, in der viele Autos fast identisch sind, bis auf die letzte Spalte, in der die Baujahre mit Komma getrennt stehen.

Am besten visualisiere ich das mal ganz einfach:

Opel Corsa 1.4 Benzin Kombi 90PS 2018
Opel Corsa 1.4 Benzin Kombi 90PS 2018, 2019
Opel Corsa 1.4 Benzin Kombi 90PS 2018, 2019, 2020

Da es neben den gezeigten Attributen noch viel mehr Spalten in der Datenbank gibt, in denen sich die Autos teilweise minimal unterscheiden, ist es keine Option (wie im Beispiel oben) einfach die ersten beiden Zeilen zu löschen.

Ich nutze ein Tabellen-Plugin mit Wordpress, welches auf einer Homepage via der $wpdb->get_results() Funktion bestimmte Zeilen aus der Tabelle zieht (Beispiel oben: Hersteller, Modell, Motorisierung, Kraftstoff, Bauart, Leistung, Baujahr) und diese dann visualisiert.

Die Spalte "Baujahr" ist für den Nutzer gar nicht sichtbar, aber wichtig, da man mittels eines Dropdowns nach Baujahr filtern kann. Somit muss der SQL Query auch Baujahr aus der Datenbank ziehen, wenn er die Tabelle erstellt.

Aktuell ist es so, dass der Nutzer, wenn er einen Corsa 1,4 aus dem Baujahr 2018 sehen will, 3 Zeilen mit komplett identischen Daten angezeigt bekommt. (siehe Beispiel-Datensatz oben).

Wählt er 2019, sind es immer noch 2 Zeilen. Und das ist eben unnötig, weil ja alle anderen Daten komplett gleich sind - er sollte also im Idealfall nur eine Zeile sehen.

Ich hoffe, bis hier ist das Problem verständlich.

Mein SQL Query im Wordpress Tabellen-Plugin sieht dann so aus:

SELECT Hersteller, Modell, Motorisierung, Kraftstoff, Bauart, Leistung, Baujahr
FROM Name_der_SQL_Tabelle
WHERE Baureihe='Corsa'
ORDER BY Baujahr DESC

In diesem Tabellen-Plugin stelle ich dann noch ein, dass er die Spalte "Baujahr" nicht zeigt und dass der User aus den kommagetrennten Werten per Dropdown nach einem Jahr filtern kann.

Was ich nun gerne hätte (hoffentlich ist das überhaupt per SQL möglich), wäre irgend ein Query-Zusatz (DISTINCT habe ich schon etwas angetestet, bisher erfolglos), der diese Dopplungen entfernt.

Gibt es sowas, oder muss ich das auf einer komplizierteren Ebene lösen?

Vielen Dank und liebe Grüße
 
Werbung:
völlig kapott.

Ist eine Zeile der Tabelle für ein konkretes Auto? Wie kann ein Auto 3 verschiedene Baujahre haben? Warum das dann auch noch als Komma-Liste?

Code:
 auto  |    baujahr     
-------+----------------
 corsa | 2018
 corsa | 2018,2019
 corsa | 2018,2019,2020
(3 rows)

test=*# select distinct on (auto) auto, baujahr from maddobs order by auto, baujahr;
 auto  | baujahr
-------+---------
 corsa | 2018
(1 row)

test=*# select distinct on (auto) auto, baujahr from maddobs order by auto, baujahr desc;
 auto  |    baujahr     
-------+----------------
 corsa | 2018,2019,2020
(1 row)

test=*#

Aber, wie gesagt, das sieht komplett kapott aus und kann daher offenbar entsorgt werden.
 
Eine Zeile der Tabelle ist immer ein konkretes Auto, genau.

Wie ich oben geschrieben hatte, hat die Datenbank insgesamt ca. 40 Spalten - also gibt es sehr viele fast komplett identische Autos, die sich in irgendeiner Spalte (minimale CO2 Änderungen oder so) unterscheiden. Da ich aber wie im Beispiel oben nur einige Spalten der Tabelle anzeigen lasse, sind diese komplett identisch. So kommt das "vermeintlich gleiches Auto aber verschiedene Baujahre" zustande.

Ein Corsa, der eben in 2018, 2019 und 2020 hergestellt wurde, hat manchmal minimal andere Parameter als ein Corsa der minimal abweicht (für uns aber nicht sichtbar, da die Spalten die ich anzeigen lasse komplett identisch sind).

Baujahr deshalb als Komma Liste, damit das Filter - Plugin der Tabelle arbeiten kann und der Nutzer nach Baujahr auswählt.

Ist es also irgendwie möglich, die Spalte Baujahr isoliert vom Rest abzurufen, so dass keine Duplikate entstehen?

Liebe Grüße
 
Okay vielen Dank. Könntest du mir, basierend auf dem obigen Query eine SQL Abfrage schicken, die alle Zeilen außer Baujahr abruft und "Baujahr" aggregiert?

Wie gesagt, ich bin Anfänger :)

LG
 
Code:
test=*# select * from maddobs ;
 auto  | farbe | baujahr
-------+-------+---------
 astra | rot   | 2018
 astra | gelb  | 2018
 astra | gelb  | 2019
 astra | gelb  | 2020
 golf  | rot   | 2018
(5 rows)

test=*# select * from maddobs where auto = 'astra' and farbe = 'gelb';
 auto  | farbe | baujahr
-------+-------+---------
 astra | gelb  | 2018
 astra | gelb  | 2019
 astra | gelb  | 2020
(3 rows)

test=*# select auto, farbe, string_agg(baujahr::text,', ') from maddobs where auto = 'astra' and farbe = 'gelb' group by auto, farbe;
 auto  | farbe |    string_agg   
-------+-------+------------------
 astra | gelb  | 2018, 2019, 2020
(1 row)

test=*#
 
Werbung:
Zurück
Oben