Zu Hauptinhalt springen
Verwenden von Inter-Record-Funktionen: Peek, Previous und Exists

AUF DIESER SEITE

Verwenden von Inter-Record-Funktionen: Peek, Previous und Exists

Diese Funktionen werden benötigt, wenn zur Evaluation des aktuellen Datensatzes Werte aus vorangehenden Datensätzen herangezogen werden sollen.

In diesem Teil des Tutorials werden die Funktionen Peek(), Previous() und Exists() besprochen.

Peek()

Peek() gibt den Wert eines Feldes in einer Tabelle für eine Zeile zurück, die bereits geladen wurde. Die Zeilennummer kann wie die Tabelle festgelegt werden. Wenn keine Zeilennummer angegeben ist, wird der letzte zuvor geladene Datensatz verwendet.

Syntax:  

Peek(fieldname [ , row [ , tablename ] ] )

Zeile muss eine ganze Zahl sein. 0 steht für den ersten Datensatz, 1 für den zweiten usw. Mithilfe von negativen Zahlen können die Datensätze vom unteren Ende der Tabelle aus gezählt werden. -1 bezeichnet den letzten gelesenen Datensatz.

Ist keine Zeile angegeben, wird -1 angenommen.

Tablename ist eine Tabellenbezeichnung ohne abschließenden Doppelpunkt. Fehlt tablename, wird die aktuelle Tabelle verwendet. Wird die Funktion außerhalb der LOAD-Anweisung verwendet oder bezieht sie sich auf eine andere Tabelle, muss tablename explizit angegeben werden.

Previous()

Previous() liefert den Wert der expr-Formel, wobei für die Berechnung Daten aus dem letzten Datensatz verwendet werden, der nicht durch einen where-Zusatz ausgeschlossen wurde. Im ersten Datensatz einer internen Tabelle liefert diese Funktion NULL.

Syntax:  

Previous(expression)

Die Previous()-Funktion kann verschachtelt sein, um auf weiter zurückliegende Datensätze zuzugreifen. Die Daten werden direkt aus der Eingabequelle abgerufen, wodurch auch ein Bezug auf Felder möglich ist, die nicht in Qlik Sense geladen wurden, d. h. selbst wenn sie nicht in der assoziativen Datenbank gespeichert wurden.

Exists()

Exists() bestimmt, ob ein spezifischer Feldwert bereits in das Feld im Datenladeskript geladen wurde. Die Funktion gibt TRUE oder FALSE zurück, und kann deshalb in der where-Bedingung eines LOAD-Befehls oder eines IF-Befehls verwendet werden.

Syntax:  

Exists(field [, expression ] )

Das Feld muss in den bisher vom Skript geladenen Daten vorhanden sein. Expression ist eine Formel, die den zu suchenden Wert im angegebenen Feld ergibt. Wird sie weggelassen, wird der aktuelle Wert des Datensatzes angenommen.

Verwenden von Peek() und Previous()

In ihrer einfachsten Form werden Peek() und Previous() verwendet, um spezielle Werte in einer Tabelle zu ermitteln. Es folgt ein Beispiel der Daten in der Tabelle Employees, die Sie in dieser Übung laden.

Beispiel der Daten aus der Tabelle „Employees“
Datum Eingestellt Entlassen
1/1/2011 6 0
2/1/2011 4 2
3/1/2011 6 1
4/1/2011 5 2

Derzeit werden hier nur Daten für Monat, Einstellungen und Kündigungen erfasst. Daher werden wir Felder für Employee Count und Employee Var mit den Funktionen Peek() und Previous() hinzufügen, um die monatliche Differenz bei der gesamten Belegschaft zu ermitteln.

  1. Öffnen Sie die App Erweitertes Skript-Tutorial.
  2. Fügen Sie einen neuen Skriptabschnitt im Dateneditor hinzu.
  3. Rufen Sie den Abschnitt Employees auf.
  4. Klicken Sie im rechten Menü unter DataFiles auf Daten auswählen.

  5. Laden Sie Employees.xlsx hoch und wählen Sie die Datei aus.
  6. InformationshinweisAchten Sie unter Field names darauf, dass der Eintrag Embedded field names ausgewählt ist, damit die Namen der Tabellenfelder beim Laden der Daten eingeschlossen sind.
  7. Klicken Sie im Fenster Daten auswählen aus auf Skript einfügen.
  8. Ihr Skript sollte folgendermaßen aussehen:

    LOAD "Date", Hired, Terminated FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet1);

  9. Bearbeiten Sie das Skript, sodass es folgendermaßen aussieht:

    [Employees Init]: LOAD     rowno() as Row,     Date(Date) as Date,     Hired,     Terminated,     If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count] FROM [lib://DataFiles/Employees.xlsx]		 (ooxml, embedded labels, table is Sheet1);

  10. Die Datumsangaben im Date-Feld der Excel-Tabelle werden im Format MM/TT/JJJJ angegeben. Um sicherzustellen, dass das Datum unter Verwendung des Formats aus den Systemvariablen ordnungsgemäß interpretiert wird, wird die Funktion Date auf das Feld Date angewendet.

    Mit der Funktion Peek() können Sie neue Werte, die in ein definiertes Feld geladen wurden, ermitteln. In der Formel wird zunächst geprüft, ob rowno() 1 entspricht. Wenn er 1 entspricht, gibt es keinen Wert für Employee Count. Daher werden wir die Differenz von Hired minus Terminated in das Feld einpflegen.

    Wenn der Wert für rowno() größer als 1 ist, prüfen wir den Wert für Employee Count im letzten Monat und nutzen diesen, um die Differenz zwischen dem Mitarbeiterwert für Hired in diesem Monat minus Terminated hinzuzufügen.

    Beachten Sie, dass wir in der Funktion Peek() den Wert (-1) verwenden. Dadurch wird Qlik Sense aufgefordert, den Wert über dem aktuellen Wert zu prüfen. Falls nicht (-1) angegeben ist, geht Qlik Sense davon aus, dass Sie den vorherigen Wert prüfen möchten.

  11. Fügen Sie Folgendes zum Ende des Skripts hinzu:
  12. [Employee Count]: LOAD 	Row, 	Date, 	Hired, 	Terminated, 	[Employee Count], 	If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var] Resident [Employees Init] Order By Row asc; Drop Table [Employees Init];

    Mit der Funktion Previous() können Sie den neuesten Wert, der in ein definiertes Feld geladen wurde, ermitteln. In dieser Formel wird zunächst geprüft, ob rowno() 1 entspricht. Falls der Wert gleich 1 ist, wissen wir, dass es keinen Wert für Employee Var gibt, da es keine Aufzeichnungen für den Vormonatswert Employee Count gibt. Wir geben also einfach 0 als Wert ein.

    Ist der Wert für rowno() größer als 1, wissen wir, dass es einen Wert für Employee Var gibt. Wir prüfen daher den Vormonatswert für Employee Count und ziehen diese Zahl vom Vormonatswert für Employee Count ab, um den Wert im Feld Employee Var zu erstellen.

    Ihr Skript sollte folgendermaßen aussehen:

    [Employees Init]: LOAD     rowno() as Row,     Date(Date) as Date,     Hired,     Terminated,     If(rowno()=1, Hired-Terminated,  peek([Employee Count], -1)+(Hired-Terminated)) as [Employee Count] FROM [lib://DataFiles/Employees.xlsx] (ooxml, embedded labels, table is Sheet1);  [Employee Count]: LOAD     Row,     Date,     Hired,     Terminated,     [Employee Count],     If(rowno()=1,0,[Employee Count]-Previous([Employee Count])) as [Employee Var] Resident [Employees Init] Order By Row asc;	 Drop Table [Employees Init];

  13. Klicken Sie auf Daten laden.
  14. Erstellen Sie in einem neuen Arbeitsblatt in der App-Übersicht eine Tabelle mit Date, Hired, Terminated, Employee Count und Employee Var als Spalten der Tabelle. Die sich ergebende Tabelle sollte folgendermaßen aussehen:

    Tabelle nach Verwendung von Peek und Previous im Skript

    Tabelle nach Verwendung von „Peek“ und „Previous“ im Skript.

Mit Peek() und Previous() können Sie definierte Zeilen innerhalb einer Tabelle festlegen. Der größte Unterschied zwischen den beiden Funktionen liegt darin, dass mit der Funktion Peek() der Benutzer ein Feld prüfen kann, das nicht zuvor in das Skript geladen wurde. Über die Funktion Previous() kann nur ein zuvor geladenes Feld geprüft werden. Previous() reagiert auf den Input der LOAD-Anweisung und Peek() reagiert auf den Output der LOAD-Anweisung. (Genau wie der Unterschied zwischen RecNo() und RowNo().) Das bedeutet, dass die beiden Funktionen unterschiedlich arbeiten, wenn Sie eine Where-Klausel verwenden.

Daher ist die Funktion Previous() besser geeignet, wenn Sie den aktuellen Wert mit dem vorherigen Wert vergleichen möchten. In diesem Beispiel habe wir die Mitarbeiterfluktuation von Monat zu Monat berechnet.

Die Funktion Peek() eignet sich besser, wenn Sie ein Feld bestimmen, das noch nicht in die Tabelle geladen wurde, oder wenn Sie eine spezielle Zeile bestimmen möchten. Das wurde in unserem Beispiel gezeigt. Hier berechneten wir den Wert für Employee Count, indem zum Vormonatswert für Employee Count die Differenz zwischen den angestellten und gekündigten Mitarbeitern im aktuellen Monat hinzugerechnet wurde. Wir erinnern uns: Employee Count war zuvor kein Feld in der Originaldatei.

InformationshinweisWeitere Informationen zur Verwendung von Peek() und Previous() finden Sie in folgendem Blog-Eintrag in Qlik Community: Peek() vs Previous() – When to Use Each. Die Verhaltensweisen werden im Kontext von QlikView besprochen. Die Logik gilt aber ebenso für Qlik Sense.

Verwenden von Exists()

Die Funktion Exists() wird häufig mit der Where-Bedingung im Skript verwendet, um Daten zu laden, wenn ähnliche Daten bereits in das Datenmodell geladen wurden.

Im folgenden Beispiel verwenden wir auch die Funktion Dual(), um Strings Zahlenwerte zuzuweisen.

  1. Erstellen Sie eine neue App und geben Sie ihm einen Namen.
  2. Fügen Sie einen neuen Skriptabschnitt im Dateneditor hinzu.
  3. Rufen Sie den Abschnitt People auf.
  4. Geben Sie folgendes Skript ein:
  5. //Add dummy people data PeopleTemp: LOAD * INLINE [ PersonID, Person 1, Jane 2, Joe 3, Shawn 4, Sue 5, Frank 6, Mike 7, Gloria 8, Mary 9, Steven, 10, Bill ];   //Add dummy age data AgeTemp: LOAD * INLINE [ PersonID, Age 1, 23 2, 45 3, 43 4, 30 5, 40 6, 32 7, 45 8, 54 9, 10, 61 11, 21 12, 39 ];   //LOAD new table with people People: NoConcatenate LOAD     PersonID,     Person Resident PeopleTemp;   Drop Table PeopleTemp;   //Add age and age bucket fields to the People table Left Join (People) LOAD     PersonID,     Age, 	If(IsNull(Age) or Age='', Dual('No age', 5), 	 If(Age<25, Dual('Under 25', 1), 	  If(Age>=25 and Age <35, Dual('25-34', 2), 	   If(Age>=35 and Age<50, Dual('35-49' , 3), 	    If(Age>=50, Dual('50 or over', 4) 	     ))))) as AgeBucket Resident AgeTemp Where Exists(PersonID);   DROP Table AgeTemp;

  6. Klicken Sie auf Daten laden.
  7. Im Skript werden die Felder Age und AgeBucket nur eingelesen, wenn der Wert für PersonID bereits im Datenmodell eingelesen wurde.

    In der Tabelle AgeTemp ist das Alter für PersonID 11 und 12 aufgeführt. Da diese IDs jedoch nicht in das Datenmodell (in der Tabelle People) geladen wurden, sind sie von der Bedingung Where Exists(PersonID) ausgeschlossen. Diese Bedingung kann auch wie folgt geschrieben werden: Where Exists(PersonID, PersonID).

    Die Skriptausgabe gleicht der Folgenden:

    Tabelle nach Verwendung von Exists im Skript

    Tabelle nach Verwendung von „Exists“ im Skript.

    Wurde keiner der Wert für PersonID in der Tabelle AgeTemp eingelesen, dann werden die Felder Age und AgeBucket nicht in die Tabelle People eingepflegt. Mit der Funktion Exists() können Sie verwaiste Aufzeichnungen/Daten im Datenmodell verhindern – z. B. Age- und AgeBucket-Felder ohne zugehörige Personen.

  8. Erstellen Sie ein neues Arbeitsblatt und geben Sie ihm einen Namen.
  9. Öffnen Sie das neue Arbeitsblatt und klicken Sie auf Arbeitsblatt bearbeiten.
  10. Fügen Sie eine Standardtabelle zum Arbeitsblatt mit der Dimension AgeBucket hinzu und benennen Sie die Visualisierung mit Altersgruppen.
  11. Fügen Sie dem Arbeitsblatt ein Balkendiagramm mit der Dimension AgeBucket und der Kennzahl Count([AgeBucket]) hinzu. Nennen Sie die Visualisierung Number of people in each age group.
  12. Passen Sie die Eigenschaften der Tabelle und des Balkendiagramms nach Ihren Wünschen an und klicken Sie dann auf Erledigt.

    Das Arbeitsblatt sollte folgendermaßen aussehen:

    Arbeitsblatt mit Gruppierungen nach Alter

    Arbeitsblatt mit Gruppierungen nach Alter.

Die Funktion Dual() ist nützlich im Skript oder in einer Diagrammformel, wenn einem String ein Zahlenwert zugewiesen werden muss.

Im obigen Skript gibt es eine Anwendung, die das Alter einliest, und Sie haben sich entschieden, diese Werte in Spannen zu unterteilen, damit Sie Visualisierungen auf Basis der Altersspannen im Vergleich zum tatsächlichen Alter erstellen können. Es gibt eine Spanne für Personen unter 25 Jahren, von 25 bis 35 Jahren usw. Mit der Funktion Dual() kann diesen Altersspannen ein Zahlenwert zugewiesen werden, welcher später zum Sortieren der Altersspannen in einer Listbox oder einem Diagramm verwendet werden kann. Wie im Arbeitsblatt der App werden die Daten ohne Altersangabe an das Ende der Liste gesetzt.

InformationshinweisWeitere Informationen zu Exists() und Dual() finden Sie in folgendem Blog-Eintrag in Qlik Community: Dual & Exists – Useful Functions (Dual und Vorhanden – nützliche Funktionen)