Sandra: SQL - Schwieriger Verdichtungsquery

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 ???

  1. 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.

    • Sven Rautenberg
  2. 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

    1. 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 tb

      MFG
      Andavos

  3. 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

    --
    Warum nennt sich Andreas hier MudGuard?
    Schreinerei Waechter
    Fachfragen per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
    1. Das ist ja eine gute Idee, verjoinen und mit der ID rechnen.

      Werde ich gleich mal ausprobieren.

      1. 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