SQL - Schwieriger Verdichtungsquery
Sandra
- datenbank
Hallo,
ich versuche eine lange Tabelle mit DISTINCT zu komprimieren, es gibt ein kleines Problem dabei:
Die Liste schaut so aus:
ID Name
001 Butter
002 Butter
003 Honig
004 Honig
005 Erdbeeren
006 Butter
007 Butter
008 Honig
Jetzt soll die Liste komprimiert werden auf die vorkommenden Namen,
aber nur, falls die Namen aufeinanderfolgen, Ziel also
Butter
Honig
Erdbeeren
Butter
Honig
Somit nicht die normale Abfrage mit SELECT DISTINCT, die
Butter
Honig
Erdbeeren
ergibt.
Die Reihenfolge der Namen ist durch die ID in ganz bestimmter Weise festgelegt und ändert sich nicht (hat eine Bedeutung).
Mein Lösungsansatz:
Damit ich so verdichten kann, müsste man also noch ein Zeichen für den Gruppenwechsel setzen, also
ID Name Gruppe
001 Butter 1
002 Butter 1
003 Honig 2
004 Honig 2
005 Erdbeeren 3
006 Butter 4
007 Butter 4
008 Honig 5
Dann ergäbe sich
Butter 1
Honig 2
Erdbeeren 3
Butter 4
Honig 5
Und das Ziel wäre erreicht.
Problem:
Wie formuliere ich einen SQL Befehl, welcher dieses Gruppenkennzeichen erzeugt ?? Der also immer dann die Gruppe um
eins erhöht, wenn der Name wechselt ??
Oder wie ginge es noch auf einem ganz anderen Weg ???
Moin!
Wie formuliere ich einen SQL Befehl, welcher dieses Gruppenkennzeichen erzeugt ?? Der also immer dann die Gruppe um
eins erhöht, wenn der Name wechselt ??
Keine mir bekannte SQL-Funktion leistet dies, außer du speicherst eine derartige Information schon direkt in der Tabelle mit ab (dann steht sie natürlich zur Verfügung).
Oder wie ginge es noch auf einem ganz anderen Weg ???
Der machbarere Lösungsansatz würde außerhalb von SQL laufen. Du liest deine ausgedehnte Tabelle ohne DISTINCT aus der Datenbank ein und entscheidest vor der Ausgabe jeweils, ob der Datensatz hinreichend "gleich" zum vorhergehenden ist, damit er unterdrückt werden soll.
Hallo,
evt.
SELECT DISTICT lebensmittel FROM tb WHERE gruppe = gruppe;
Und andere Frage: Sind in der Gruppe immer eine Lebensmittelart, oder können dort mehrere enthalten sein.
Wenn immer nur 1:
SELECT DISTICT gruppe FROM tb
MFG
Andavos
Das ginge, aber die Gruppe habe ich doch noch nicht !!!
Die Gruppe will ich erst erzeugen :-)
Sandra
Hallo,
evt.
SELECT DISTICT lebensmittel FROM tb WHERE gruppe = gruppe;Und andere Frage: Sind in der Gruppe immer eine Lebensmittelart, oder können dort mehrere enthalten sein.
Wenn immer nur 1:
SELECT DISTICT gruppe FROM tbMFG
Andavos
Hi,
ID Name
001 Butter
002 Butter
003 Honig
004 Honig
005 Erdbeeren
006 Butter
007 Butter
008 Honig
Jetzt soll die Liste komprimiert werden auf die vorkommenden Namen,
aber nur, falls die Namen aufeinanderfolgen, Ziel also
Wenn es Dir möglich wäre, ein Dummy-Element mit id 0 einzufügen, dann ginge es:
SELECT t.name FROM deinetabelle AS t INNER JOIN deinetabelle AS tt ON ((tt.id = (t.id - 1)) AND t.name <> tt.name)
Butter 1
Honig 2
Erdbeeren 3
Butter 4
Honig 5
Die Nummern entweder per auslesender Programmlogik dazufügen oder per Uservariablen …
cu,
Andreas
Das ist ja eine gute Idee, verjoinen und mit der ID rechnen.
Werde ich gleich mal ausprobieren.
yo,
Das ist ja eine gute Idee, verjoinen und mit der ID rechnen.
eine tabelle ist per definition eine unsortierte menge. insofern kann man zwar über die ID ein wenig tricksen, sollte das aber eher vermeiden und das daten-design entsprechend ändern. natürliche schlüssel (schlüssel mit einer bedeutung) sind zwar grundsätzlich nicht verboten, aber vielleicht nicht das gelbe vom ei. des weiteren sieht die ID spalte mir weniger nach einem zahlenformat aus, da sie führende nullen beitzt und somit wird das rechnen schwierig werden.
hilfreich für das einfügen der grupppen wäre zum einen die ID spalte in eine numerische spalte umzuwandeln, wenn auch nur vorrübergehend in einer zweiten tabelle. dann läßt sich damit rechnen, um den vorgänger, bzw. nachfolger anprechen zu können. dann ist die frage, ob dein dbms unterabfragen kann. sollte dies der fall sein, kann man mit korrelierenden abfragen die gruppen einfügen.
Ilja