
- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.
- Tags:
- qlikview_deployment
Accepted Solutions


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hi Stefan,können wir uns über pm weiterunterhalten. Konnte das leider nicht so ganz reproduzieren.
VG Markus

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
Hallo Stefan,leider klappt das wohl nicht immer. Ich bekomme z.B auch folgednes Ergebnis:
%ID | ID | ATTRIBUT.ATTRIBUT_GRPNR | ATTRIBUT.ATTRIBUTWERT | ATTRIBUT.ATTRIBUTBEMERKUNG | ATTRIBUT.ATTRIBUTGUELTIGAB | ATTRIBUT.ATTRIBUTGUELTIGBIS |
29510081 | 29 | Getriebestatus | Komponente | 14.01.2004 | 19.01.2004 | |
29510081 | 25 | Getriebestatus | Komponente | 19.01.2004 | 03.12.2004 | |
29510081 | 17 | Getriebestatus | Komponente | 03.12.2004 | 13.12.2004 | |
29510081 | 21 | Getriebestatus | Komponente | 13.12.2004 | 02.06.2005 | |
29510081 | 13 | Getriebestatus | Verwender | 02.06.2005 | 06.06.2005 | |
29510081 | 9 | Getriebestatus | Verwender | 06.06.2005 | 31.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
%ID | ID | ATTRIBUT.ATTRIBUT_GRPNR | ATTRIBUT.ATTRIBUTWERT | ATTRIBUT.ATTRIBUTBEMERKUNG | ATTRIBUT.ATTRIBUTGUELTIGAB | ATTRIBUT.ATTRIBUTGUELTIGBIS |
29510081 | 29 | Getriebestatus | Komponente | 14.01.2004 | 02.06.2005 | |
29510081 | 13 | Getriebestatus | Verwender | 02.06.2005 | 31.12.9999 |
Die Datumsinformationen (Gueltib Bis ) sind dann auch andere Richtig gut sieht das hier aus:
%ID | ID | ATTRIBUT.ATTRIBUT_GRPNR | ATTRIBUT.ATTRIBUTWERT | ATTRIBUT.ATTRIBUTBEMERKUNG | ATTRIBUT.ATTRIBUTGUELTIGAB | ATTRIBUT.ATTRIBUTGUELTIGBIS |
180266414 | 11379 | Status | neu | 07.10.2008 | 27.11.2008 | |
180266414 | 11378 | Status | gelaufen i.O. | 27.11.2008 | 11.02.2009 | |
180266414 | 11371 | Status | zerlegt | 11.02.2009 | 12.02.2009 | |
180266414 | 11364 | Status | gelaufen i.O. | 12.02.2009 | 31.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??


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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.

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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


- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Report Inappropriate Content
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
