7 Replies Latest reply: Jun 28, 2012 9:40 AM by markus1973 RSS

Doppelte Datensätze ignorieren

markus1973

Hallo Ich habe folgendes Problem. Ich möchte eine  Tabelle laden in der es auch gleiche Datensätze geben kann.Es handelt sich hierbei um eine historisierte Tabelle.

Die Tabelle besteht aus folgenden Feldern: Objekt_ID, Objektwert, Objekt, datum_ab, Datum Bis , Bemerkung

Beispiel:

Baureihe, A3, 07.10.2008,27.11.2008, NULL

Baureihe, A3, 27.11.2008,11.12.2009, NULL

Baureihe, A3, 11.02.2009,NULL, NULL

Getriebe, AUT, 07.10.2008,27.11.2008, NULL

Getriebe, AUT, 12.02.2009,12.02.2009, NULL

Getriebe, AUT, 12.02.2009,NULL, NULL

Meine Kunde möchte nun folgende Darstellung erhalten:

Wenn sich der Objektwert nicht verändert hat, soll es nur einen Datensatz geben und zwar mit dem min Datum und dem Max Datum, in dem Fall also NULL.

 

Sieht dann so aus

Baureihe, A3, 07.10.2008,NULL, NULL

Getriebe, AUT, 07.10.2008,NULL, NULL

 

Interessanmt wird das in folgendem Fall

Baureihe, neu, 07.10.2008,27.11.2008, NULL

Baureihe, gelaufen, 27.11.2008,11.12.2009, NULL

Baureihe, i.O, 11.02.2009,23.03.2009, NULL

Baureihe, gelaufen, 11.04.2009,NULL, NULL

 

Wenn ich das ganze mit einem Group by löse und der min max Funktion des Datums fällt der eine Datensatz gelaufen raus. Das möchte ich aber nicht, da der Objektwert vorher ein anderer war. Direse sollen nur dann zusammengefasst werden, wenn sie hintereinander kommen, und sich nciht verändert haben.

 

Ich hoffe ich konnte das einigermaßne erklären

 

Wie kann ich das denn galant. lösen.

  • Re: Doppelte Datensätze ignorieren
    swuehl

    Markus,

     

    bin mir nicht sicher, ob ich alle Anforderungen erfasst habe, aber hier mal ein Vorschlag.

     

    TMP1:

    LOAD Objekt_ID, Objektwert, datum_ab, if(Datum_bis='NULL', '31.12.9999',Datum_bis) as Datum_bis , Bemerkung INLINE [

    Objekt_ID, Objektwert, datum_ab, Datum_bis , Bemerkung

    Baureihe, A3, 07.10.2008,27.11.2008, NULL

    Baureihe, A3, 27.11.2008,11.12.2009, NULL

    Baureihe, A3, 11.02.2009,NULL, NULL

    Getriebe, AUT, 07.10.2008,27.11.2008, NULL

    Getriebe, AUT, 12.02.2009,12.02.2009, NULL

    Getriebe, AUT, 12.02.2009,NULL, NULL

    Baureihe, neu, 07.10.2008,27.11.2008, NULL

    Baureihe, gelaufen, 27.11.2008,11.12.2009, NULL

    Baureihe, i.O, 11.02.2009,23.03.2009, NULL

    Baureihe, gelaufen, 11.04.2009,NULL, NULL

    ];

     

    TMP2:

    LOAD *, Recno() as ID

    , if (peek(Objektwert)=Objektwert,if(peek(GruppenID),peek(GruppenID),Recno())) as GruppenID resident TMP1;

     

    TMP3:

    Noconcatenate LOAD Objekt_ID, Objektwert, datum_ab, Datum_bis , Bemerkung, ID

    ,if(peek(Objektwert)=Objektwert, peek(GruppenID),GruppenID) as GruppenID 

    resident TMP2 order by ID desc;

     

    drop tables

    TMP1,

    TMP2

    ;

     

    TMPResult:

    Noconcatenate LOAD GruppenID as ID, only(Objekt_ID) as Objekt_ID, only(Objektwert) as Objektwert, Date(min(datum_ab)) as datum_ab, Date(max(Datum_bis)) as Datum_bis , concat(Bemerkung,',') as Bemerkung Resident TMP3 where not isnull(GruppenID) group by GruppenID ;

     

    LOAD ID, Objekt_ID, Objektwert, datum_ab, Datum_bis, Bemerkung Resident TMP3 where isnull(GruppenID);

     

    Result:

    NoConcatenate LOAD * resident TMPResult order by ID;

     

    drop tables TMPResult, TMP3;

     

    Zuerst habe ich mal das Enddatum auf ein Datum in ferner Zukunft gesetzt, falls der Eingangswert NULL ist (musst natürlich isnull() verwenden, wenn du aus der Datenbank liest). Dann kann ich später max() verwenden.

     

    Dann gehe ich davon aus, dass die Originaltabelle in der Reihenfolge kommt, wie du sie für die Auswertung brauchst.

     

    Dann zweimal schnell drübergehen und ein neues Feld GruppenID bilden, das zusammenhängende Zeilen mit gleichem Objektwert kennzeichnet (das kannst du ausbauen, um weitere Felder mit aufzunehmen, z.B: gleiche Objektwert und ObjektID).

     

    Dann einmal nur die Gruppen einlesen und mit group by und aggregierung die Zeilen zusammenfassen.

     

    Und noch am Ende die anderen zeilen dazulesen und fürs Auge nochmal sortieren (den letzten Schritt kannste eigentlich weglassen).

     

    Gruß,

    Stefan

    • Doppelte Datensätze ignorieren
      markus1973

      Hi Stefan,können  wir uns über pm weiterunterhalten. Konnte das leider nicht so ganz reproduzieren.

      VG Markus

      • Doppelte Datensätze ignorieren
        markus1973


        Hallo Stefan,leider klappt das wohl nicht immer. Ich bekomme z.B auch folgednes Ergebnis:

        %IDIDATTRIBUT.ATTRIBUT_GRPNRATTRIBUT.ATTRIBUTWERTATTRIBUT.ATTRIBUTBEMERKUNGATTRIBUT.ATTRIBUTGUELTIGABATTRIBUT.ATTRIBUTGUELTIGBIS
        2951008129GetriebestatusKomponente14.01.200419.01.2004
        2951008125GetriebestatusKomponente19.01.200403.12.2004
        2951008117GetriebestatusKomponente03.12.200413.12.2004
        2951008121GetriebestatusKomponente13.12.200402.06.2005
        2951008113GetriebestatusVerwender02.06.200506.06.2005
        295100819GetriebestatusVerwender06.06.200531.12.9999

        Wie du siehst sind die ersten 4 und die letzten 2 Zeilen gleich. Ich muss jetzt aus diesen 6 Zeilen 2 machen, da sich die Komponente nicht verändert hat. Ebenso die Vrewender. Als ergebnissatz muss ich dann folgendes erreichen

        %IDIDATTRIBUT.ATTRIBUT_GRPNRATTRIBUT.ATTRIBUTWERTATTRIBUT.ATTRIBUTBEMERKUNGATTRIBUT.ATTRIBUTGUELTIGABATTRIBUT.ATTRIBUTGUELTIGBIS
        2951008129GetriebestatusKomponente14.01.200402.06.2005
        2951008113GetriebestatusVerwender02.06.200531.12.9999


        Die Datumsinformationen (Gueltib Bis ) sind dann auch andere Richtig gut sieht das hier aus:

        %IDIDATTRIBUT.ATTRIBUT_GRPNRATTRIBUT.ATTRIBUTWERTATTRIBUT.ATTRIBUTBEMERKUNGATTRIBUT.ATTRIBUTGUELTIGABATTRIBUT.ATTRIBUTGUELTIGBIS
        18026641411379Statusneu07.10.200827.11.2008
        18026641411378Statusgelaufen i.O.27.11.200811.02.2009
        18026641411371Statuszerlegt11.02.200912.02.2009
        18026641411364Statusgelaufen i.O.12.02.200931.12.9999


        Hier gibt es zwar 2 mal den wert gelaufen i.O, da aber noch ein andere dazwischen war darf dieser nicht wegfallen.Habe ich was falsch gemacht??

        • Re: Doppelte Datensätze ignorieren
          swuehl

          Markus,

           

          bei Komponente und Verwender hat das also nicht funktioniert? Du kannst ja mal in meinem Code alles nach

           

          drop tables

          TMP1,

          TMP2

          ;

           

          auskommentieren, dir also nur mal TMP3 anschauen. hier solltest du deine Eingangstabelle sehen nur mit zusätzlichen Feldern. Deine Zeilen, die nicht richtig zusammengefasst werden, welche GruppenID haben die denn?

           

          Wie gesagt, gehe ich davon aus, dass du die Eingansgtabelle in der richtigen Sortierung lieferst, sonst ist der Vergleich mit dem vorangehenden Wert für den Attributwert natürlich nicht wirklich möglich.

           

          edit: Das pm System innerhalb QV ist ja wg. Spamming schon des längeren deaktiviert. Du kannst mir ja auf vorname.nachname at systematika.com eine Mail schreiben.