SQL Abfrage: Bei "identischen" (bis auf ID) Datensätzen nur den ersten filtern...

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von bitmonk.

    SQL Abfrage: Bei "identischen" (bis auf ID) Datensätzen nur den ersten filtern...

    Hallo Zusammen,

    bin kein SQL Experte, wäre super wenn ihr mir hier helfen könntet.
    Folgende Aufgabenstellung:
    Wir haben teilweise Datensäte die bis auf die Schlüssel ID identisch sind.
    Wir würden nun gerne davon jeweils einen anzeigen lassen, jedoch mit der Schlüssel ID.
    D.h. der "erste" der gefunden wird soll komplett angezeigt werden.

    Beispiel

    ID Name Datum Zeit Status
    1 Hans 01.01.12 06.06 OK
    2 Hans 01.01.12 06.06 OK
    3 Hans 01.01.12 12.01 AUSGELIEFERT

    In dem Fall hätten wir gerne die 1 und die 3 angezeigt. Ich habe es über mehrere Group By s versucht, jedoch kann ich dann natürlich keine ID mehr anzeigen, diese muss aber vorhanden sein da Sie in der Anwendung noch andere Funktionen übernimmt.

    Danke schon mal für eure Hilfe!

    Grüße

    b


    Edit by Dodo:
    -> Quote entfernt

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „bitmonk“ ()

    Und welche Id ist dann die relevante ?
    Ich denke, dass der aktuelle Zustand der Daten äusserst unschön ist.
    Es gibt natürlich Wege, dein Ziel zu erreichen, jedoch solltest du, wenn möglich die doppelten Einträge verhindern.
    Was hat denn eine ID noch für einen Sinn, wenn sie keinen eindeutigen Datensatz repräsentiert.

    Mein Rat, keine provisorische Lösung frickeln sondern das Konzept so ändern, dass keinen komplett identische Datensätze entstehen.
    Das ist meine Signatur und sie wird wunderbar sein!
    Ich gehe mal davon aus, das es sich hier bei um ein Bestellsystem oder ähnliches handelt.

    Warum nehmt ihr in der der Tabelle nicht die Kundennummer sondern den Namen, so hat man eigentlich kein Kriterium das man hernehmen könnte ohne das es eventuell Überlagerungen gibt.
    Beispiel wäre hierfür wenn ein zweiter Hans bei euch bestellt.

    Das Problem ist hier die Datenbankstruktur.
    Ist dir diese vorgegeben oder hast du sie selbst entworfen?

    Am besten wären mehrere Tabellen:

    - Kunde
    - Bestelllung
    - Artikel
    - Bestellung_Artikel
    - Bestellstatus

    kommt ganz auf die Anforderungen an.

    Es gibt schon eine Möglichkeit über Subselect und eventuell einen Inner Join, aber wie gesagt hier stößt man schnell an die grenzen wenn es einen zweiten Hans oder so gibt.
    Ja, am elegantesten wäre wohl erst gar keine doppelten Datensätze in der Datenbank zu haben.

    Es geht hier um kein Bestellsystem, sondern um eine DB mit Trackingdaten (=Sendungsverfolgung)

    Von verschiedenen Speditionspartner erhalten wir Trackingupdates im CSV Format. Von daher haben wir auch keinen Einfluss auf die Datenstruktur, unsere Kundennummern können z.B. nicht dirket verwendet werden da unsere Partner diese nicht verwenden. Lediglich über die jeweiligen Sendungsnummern können diese dann bei uns intern zugeordnet werden.

    Die CSV Dateien werden bei jedem Statusupdate um weitere Zeile ergänzt also z.B.

    CSV Datei 1

    1 Hans 01.01.12 06.06 OK




    CSV Datei 2

    1 Hans 01.01.12 06.06 OK
    2 Hans 01.01.12 06.06 OK
    3 Hans 01.01.12 12.01 AUSGELIEFERT




    Diese werden dann automatisch in die DB importiert (Flowheater ftw, kennt das jemand?) , jedoch eben stur alles was da kommt. Das hat natürlich die doppelten DSätze zur folge... Wie könnten wir das umgehen? Schon beim Import? Oder erst im DBMS?

    Wie gesagt, bin ein "Anfänger", muss dieses Projekt aber im Rahmen meiner Ausbildung realisieren...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „bitmonk“ ()

    Ist Hans die Sendungsnummer oder der Name eurer Firma?

    Ich würde beim Import ansetzen und die doppelten Datensätze gar nicht erst in die Datenbank importieren,
    dies wäre die sinnvollste Variante und man spart sich somit das gefrickel mit der Datenbankabfrage.
    ...Name kommt im Prinzip nicht vor, sollte nur als Beispiel dienen.

    Ich werde jetzt mal beim Import ansetzten, das macht wohl am meisten Sinn.

    Mal sehen ob unser Importtool eine entsprechende Funktion hat...



    Falls es nicht klappt und ich mit diesen Datensätzen weiter arbeiten muss,

    gäbe es theoretisch eine Lösung per SQL?
    Theoretisch gibt es für alles eine Lösung.

    Nur so gesehen ist absolut kein Ansatzpunkt vorhanden wenn der Name jetzt auch noch wegfällt.
    Speichert ihr die TrackingID nicht mit in der Datenbanktabelle?

    Weil so würde in der Datenbank ja einfach nur stehen:

    1 DATUM STATUS
    2 DATUM STATUS
    3 DATUM STATUS
    4 DATUM STATUS
    5 DATUM STATUS

    ohne jeglichen Zusammenhang.
    Hierfür dann eine Möglichkeit zu finden die verschiedenen Werte im Feld Status zu "filtern" wird schwer.
    Der Datensatz war nur ein Beispiel um mein Anliegen zu verdeutlichen.

    So siehts in der Praxis aus:

    ID PaketNr SendungsNr Datum Zeit Scanart Scanort Status Bearbeiter Partner

    1 875434 450001 01.07.12 06.23 Ausgang 87435 OK Typ FEDEX

    2 987455 120004 02.07.12 08.45 Eingang 45789 beschädigt Guy DPD

    Anhand der Sendungsnummer können wir dann eine Verknüpfung zu unserer Auftragstabelle erstellen um die Sendungen unseren

    Kunden zuordnen zu können.
    Das ist doch schon mal was :)

    Dann kannst du einfach machen


    SQL-Abfrage

    1. SELECT ....
    2. FROM Tabelle1 a
    3. INNER JOIN Tabelle1 b
    4. ON a.SendungsNr = b.SendungsNr
    5. WHERE a.Status != b.Status


    Oder eben auf die PaketNr joinen.

    Somit solltest du alle Datensätze vom gleichen Paket bekommen, welche aber einen anderen Status haben.
    Ist ungetestet also probier es mal bei dir in der Datenbank aus und bei Fragen kannst du dich gerne nochmal melden.
    so bin im Moment im Kontakt mit dem Entwickler unseres Importtools, evtl kann er mir helfen gleich von Anfang an Doppelte auszufiltern...

    Was die SQL Abfrage angeht befürchte ich dass das so nicht klappt. Oftmals ist es so dass die Datensätze sich in nur ein oder 2 Atributen unterscheiden,

    die anderen können durchaus identisch sein. Status1 != Status2 hätte zur folge das nur DSätze mit unterschiedlichen Stati ausgegeben werden, korrekt?

    Es ist aber so, dass oftmals bei jedem Datenstatz der Status "OK" ist, bis ein Problem oder die Auslieferung erfolgt. Das wäre jetzt aber nur ein Beispiel von vielen...

    Das heisst es müsste jedes Atribut mit jedem verglichen werden, sobald es auch nur zu einer Abweichung kommen würde, müsste er ausgegeben werden (dabei müsste natürlich aber die ID aussen vor gelassen werden)



    Wie gesagt ich werde mal versuchen den Datenimport zu optimieren. An der Stelle schon mal Danke für eure Posts!