Es gibt immer wieder fälle in denen man bei Qlik Sense ein Feld Klassieren muss es kann sein das ich das Alter in Gruppen von 10 Jahren einteilen muss. Es gibt auch noch diverse andere Datenfelder die sich in Klassen/ Gruppen einteilen lassen. In Qlik Sense gibt es mehrere Funktionen, die einem da behilflich sein können, das sind zum einen die Class-Funktion und Interfall-Funktion. Die Class-Funktion ist eher einfach und kann supergut verwendet werden auch in Charts. Die InterfalMatch-Funktion ist etwas komplexer, aber man muss sich nicht davon abschrecken lassen, denn die Funktionalität kann auch andere Themen als nur eine Klasse erstellen auflösen. Mit der IntervalMatch Funktion kann ein GültigVon (ValidFrom) und ein GültigBis (ValidTo) aufgelöst werden.
Falls das gemacht wird, bitte etwas Vorsicht, die Menge der Datensätze kann schnell sehr gross werden. Aber mehr dazu weiter unten. Zuerst erklären wir die Class-Funktion, welche euch sicher schon mal weiterhilft.

Class-Funktion

Die Class-Funktion (Chart und Skript) erstellt ein neues Datenfeld welches eine Gruppierung/ Klassierung (English «bins») erstellt für die Werte im Feld, welches der Funktion mitgegeben wird.
Die Klassierung erfolgt linear und der Sprungwert wird durch den Intrerval Parameter bestimmt.
(z.B. interfall 5 => 0 -5, 6 – 10, etc.). Die Funktion kann noch zwei weiter Parameter aufnehmen, mit dem Label kann der Klassierungswert «A<=x<B» den Wert X verändern oder durch einen anderen Wert ersetzen. Der Parameter «offset» kann der Startwert (Default ist 0) erhöht werden.

Beispiel

class( var,10 ) as NeueKlasse

Das ergibt bei einem Wert von 25 die Klassierung «20<=x<30».

Wenn die Class Funktion im Script verwendet wird, kann diese sehr gut als Precedingload verwendet werden, dadurch wird die Lesbarkeit nicht so stark beeinflusst. Es kann sein, dass mit dem Precedingload etwas langsamer geladen wird. Ist das relevant, kann es sinnvoll sein die Class Funktion direkt im Load eingefügt werden muss. Falls das nicht geht und ein Precedingload nicht erlaubt ist, kann das Ganze auch mit einem Resident-Load gelöst werden. Aber diese Variante denke ich ist die am wenigsten geeignete.

Grösster Nachteil der Class funktion, die Klasse ist immer gleich gross und der Text muss etwas angepasst werden. Das kann einfach gelöst werden in dem die Funktion unten verwendet wird.

Beispiel

                Replace( class (var, 10), ‘<=x<’, ‘ – ‘)        // => bei 25, 20 - 30

Falls du die Beispiele verwenden willst, müssen die Beispielwerte ersetzt werden.

Var         => Feld mit den Werten, es muss eine Zahl sein.

10           => Intervall Grösse, Zahl die der Weite der Klasse entspricht, im Bsp. Waren es 10.

‘ – ‘        => wird nur verwendet wenn der Bindestich nicht als Trennzeichen verwendet werden soll.

IntervalMatch

Die Intervall-Funktion kann nur im Skript verwendet werden. Was kann die IntervalMatch-Funktion, für was kann ich diese verwenden? Mit der IntervalMatch-Funktion kann Qlik ein Feld mit mehreren Werten, meist Zahlenwerte, in eine Klasse («bins») einteilen. Das kann die Class-Funktion auch, die InterfalMatch-Funktion kann das aber anhand einer Tabelle welche die Klassen («bins») und Von, Bis Werte enthält, so kann man die Grösse der Klassen dynamisch halten. Wann wird so was benötigt? Zum Beispiel wenn ein GültigVon und GültigBis in einer Dimensions Tabelle hat und diese auf eine Faktentabelle gemappt werden soll. Es kann auch für das Alter gemacht werden, Start Jahr und Ende Jahr für eine Gruppe definieren und der Name der Klasse. Das reicht schon. Wie es geht, wird unten erklärt.
Hier der Link zu den Qlik Help IntervalMatch ‒ Qlik Sense on Windows

Beispiel

EventLog:
LOAD * Inline [
Time, Event, Comment
00:00, 0, Start of shift 1
01:18, 1, Line stop
02:23, 2, Line restart 50%
04:15, 3, Line speed 100%
08:00, 4, Start of shift 2
11:43, 5, End of production
];
 
OrderLog:
LOAD * INLINE [
Start, End, Order
01:00, 03:35, A
02:30, 07:58, B
03:04, 10:27, C
07:23, 11:43, D
];
 
//Link the field Time to the time intervals defined by the fields Start and End.
Inner Join IntervalMatch ( Time )
LOAD Start, End
Resident OrderLog;

Ergebnis

Time

Start

End

Order

00:00

-

-

-

01:18

01:00

03:35

A

02:23

01:00

03:35

A

04:15

02:30

07:58

B

04:15

03:04

10:27

C

08:00

03:04

10:27

C

08:00

07:23

11:43

D

11:43

07:23

11:43

D

 

 

 

 

 

 

 

 

 

 

 

 

 

 Im Ergebnis ist gut zu sehen, wie die InterfvalMatch die Spalte Order mit der richtigen Zeitspanne zuteilt. Dabei spielt es keine Rolle, ob die Gruppen überschneidend sind oder nicht. Ich kann aber empfehlen, dass die Gruppen nicht überschneidend sind, da diese dazu führen kann, dass ein Rekord plötzlich mehrfach vorkommt. Diese Verdopplung führt dazu, dass in Auswertungen falsche Summen entstehen und der Fehler kann nur mit grossem Aufwand ermittelt werden. Daher ist es zu vermeiden!

Es kann nicht nur eine Start und Ende Zeit als Parameter verwendet werden. Da kann auch ein Start und Ende Datum. Diese beide Datum könne aus der Dimensionstabelle ermittelt werden. So können die Klassen mit der IntervalMatch Funktion erstellt werden.

 

 

IntervalMatch nutzten um ein Datum aufzulösen

Falls aber nun das GültigVon und GültigBis Datum auf ein Einzeldatum aufgelöst werden soll (Pro mögliches Datum zwischen dem GültigVon und GültigBis Datum ein Rekord erstellen damit ein Link zwischen der Fakten Tabelle und der Dimension erstellt werden kann) muss noch etwas mehr gemacht werden.

Wichtig hier zu wissen, es werden mehrere Datensätze erstellt für aktuell einen Datensatz.

 

Beispiel 

// Tabelle mit GültigVon, GültigBis Feldern
User:
Load * Inline [
ID, Name, From, To
1,Markus, 01.01.2000, 31.12.9999
2,Toni, 15.03.2011, 31.12.9999
3,Maria, 03.05.2015, 30.09.2021
4,Werner,01.04.2016,31.12.2020
];
 
//********************************************************************
// Skript für das auflösen GültigVon und GültigTo (From, To Date)
//********************************************************************
// Ermitteln der Max und Min Datum aus From und To
Temp:
Load max(To) as MaxDat
                , min(From) as MinDat
Resident User;
 
Let varMaxDate = peek('MaxDat', 0, Temp);
Let varMinDate = peek('MinDat', 0, Temp);
drop Table Temp;
 
// Hier wird geprüft ob das Max Date <= Heute ist,
// wenn ja, wird heute als Max gesetzt.
if varMaxDate > num(Today()) then
                let varMaxDate = num(Today());
End if
 
// Kalender für diese Zeit erstellen
TempCalendar:
LOAD $(varMinDate) + Iterno()-1 As Num,
                Date($(varMinDate) + IterNo() - 1) as TempDate
AutoGenerate 1 While $(varMinDate) + IterNo() -1 <= $(varMaxDate);
 
// Masterkalender ist nur ein Example, kann/ muss ersetzt werden
// durch den eigenen Kalender.
MasterCalendar:
Load
                TempDate AS %DateId,
                Year(TempDate) As Year,
                Month(TempDate) As Month,
                date(monthstart(TempDate), 'MMM-YYYY') as MonthYear,
    Date(TempDate) as Datum
Resident TempCalendar
Order By TempDate ASC;
 
Drop Table TempCalendar;
 
// Link Kalender mit From und To Datum, mit grösser gleich und kleiner geich
Temp2:
Load
[%DateId]
Resident MasterCalendar;
 
left join Load
                From
    ,date(if(num(To) > num(Today()), Today(), To), 'DD.MM.YYYY') as To
Resident User;
 
Temp3:
NoConcatenate
Load Distinct
                [%DateId]
                ,From & '|' & To as %FromTo
Resident Temp2
Where [%DateId] >= From
and [%DateId] <= To;
 
Drop Table Temp2;
 
// Link die Temp3 Tabelle nun mit der User Tabelle,
// so werden die User pro Tag angelegt.
TempUser:
NoConcatenate
Load
                *
                , From & '|' & date(if(num(To) > num(Today()), Today(), To), 'DD.MM.YYYY') as %FromTo
Resident User;

// Neue Tabelle mit den Datum, GültigVon und GültigBis an User joinen und dann löschen.
// Dieser Teil kann auch ausgelassen werden, dann sind es 3 Tabellen.
left join Load *
Resident Temp3;


Drop Table Temp3;
Drop Field %FromTo;

// Diese Tabellen muss gelöscht werden und dann Umbenannt.
drop Table User;
Rename Table TempUser to User;

Ergebnis 

Dieses Beispiel zeigt wie mit der IntervalMatch Funktion das Problem gelöst werden kann.
Bitte seit euch bewusst, dass wenn die Dimensionstabelle viele Records hat, kann die Linktabelle Temp3 sehr gross werden. Der zweite Treiber für die Anzahl Rows ist das Min und Max Datum der Dimensionstabelle. Eventuell kann diese aber eingeschränkt werden auf der Quelle, so dass nicht jeder Tag erstellt werden muss für die Tabelle.
Das als kleiner Tipp, der euch das ganze vereinfachen kann. Falls ihr fragen habt zu dem Thema, schreibt mir eine Mail.

 

 

 

 

 

Wir haben es geschafft irgend wo in der Qlik Community auf zu poppen.

Das war nicht unser erstes und grösstes Ziel.
Aber es ist auch schon zu sehen wie der Blog wächst und wahrgenommen wird. 
Link zu der Umfrage Second version of "Qlik Blog portfolio" released

Hier noch das Bild des Portfolios

Wir werden weiter machen wie bisher, der Focus liegt weiter beim bloggen von technischen Artikeln.

Mit einem grossen lächeln Renato von Qlikblog.ch