Skip to main content
Announcements
Have questions about Qlik Connect? Join us live on April 10th, at 11 AM ET: SIGN UP NOW
cancel
Showing results for 
Search instead for 
Did you mean: 
Not applicable

Doppelte Datensätze ignorieren

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.

1 Solution

Accepted Solutions
swuehl
MVP
MVP

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

View solution in original post

7 Replies
swuehl
MVP
MVP

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

Not applicable
Author

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

VG Markus

Not applicable
Author


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

swuehl
MVP
MVP

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.

Not applicable
Author

Hallo Stefan,

komme leider nicht voran. Habe wohl immer noch ein problem mit der Sortierung. nach welchen Kriterien sollte denn die eingangstabelle sortiert sein.

Ich denke zunächste nach dem Feld ATTRIBUT.ATTRIBUT_GRPNR und dann nach dem Datum_ab.

Doch leider schient das nicht zu funktionieren.

Gruß

Markus

swuehl
MVP
MVP

Das kann ich dir nicht beantworten, nach welchen Kriterien du sortieren sollst, da dass natürlich beeinflusst, wann eine Änderung in Objektwert festgestellt wird. Frag evtl. einen fachlichen Ansprechpartner.

Deine email kam an.

Gruß,

Stefan

Not applicable
Author

Hallo Stefan,

Sorry für die Späte Antwort.

Spreche aus Lob und Anerkennung. Ich habe es tatsächlich gelöst bekommen. Musste das eine oder andere noch anpassen bzw. den Schlüssel erweitern.

Viele Grüße

Markus