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.