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.
Die Funktion peek() wird am häufigsten verwendet, um die relevanten Grenzwerte in einer zuvor geladenen Tabelle zu finden, also den ersten Wert bzw. den letzten Wert eines bestimmten Feldes. In den meisten Fällen wird dieser Wert zur späteren Verwendung in einer Variablen gespeichert, beispielsweise als Bedingung in einer do-while-Schleife.
Syntax:
Peek(
field_name
[, row_no[, table_name ] ])
Rückgabe Datentyp: dual
Argumente:
Argumente
Argument
Beschreibung
field_name
Name für das Feld, für das der Rückgabewert erforderlich ist.Eingabewert muss als String angegeben werden (zum Beispiel in einfachen Anführungszeichen).
row_no
Die Zeile in der Tabelle, die das erforderliche Feld enthält. Kann eine Formel sein, die aber eine ganze Zahl ergeben muss. 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.
Fehlt row_no, wird -1 angenommen.
table_name
Ein Tabellenname ohne abschließenden Doppelpunkt. Fehlt table_name, wird die aktuelle Tabelle verwendet. Wird die Funktion außerhalb des LOAD-Befehls verwendet oder bezieht sie sich auf eine andere Tabelle, muss table_nameexplizit angegeben werden.
Beschränkungen:
Die Funktion kann nur Werte aus bereits geladenen Datensätzen zurückgeben. Das bedeutet, dass im ersten Datensatz einer Tabelle ein Aufruf, der -1 als row_no verwendet, NULL zurückgibt.
Beispiel 1
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
EmployeeDates:
Load * Inline [
EmployeeCode|StartDate|EndDate
101|02/11/2010|23/06/2012
102|01/11/2011|30/11/2013
103|02/01/2012|
104|02/01/2012|31/03/2012
105|01/04/2012|31/01/2013
106|02/11/2013|
] (delimiter is '|');
First_last_Employee:
Load
EmployeeCode,
Peek('EmployeeCode',0,'EmployeeDates') As FirstCode,
Peek('EmployeeCode',-1,'EmployeeDates') As LastCode
Resident EmployeeDates;
Ergebnistabelle
Mitarbeitercode
StartDate
EndDate
FirstCode
LastCode
101
02/11/2010
23/06/2012
101
106
102
01/11/2011
30/11/2013
101
106
103
02/01/2012
101
106
104
02/01/2012
31/03/2012
101
106
105
01/04/2012
31/01/2013
101
106
106
02/11/2013
101
106
FirstCode = 101, weil Peek('EmployeeCode',0, 'EmployeeDates') den ersten Wert von EmployeeCode in der Tabelle EmployeeDates liefert.
LastCode = 106, weil Peek('EmployeeCode',-1, 'EmployeeDates') den letzten Wert von EmployeeCode in der Tabelle EmployeeDates liefert.
Durch den Ersatz des Werts des Arguments row_no werden die Werte von anderen Zeilen in der Tabelle wie nachfolgend beschrieben ausgegeben:
Peek('EmployeeCode',2, 'EmployeeDates') liefert den dritten Wert (103) in der Tabelle als den FirstCode.
Beachten Sie jedoch, dass sich die Funktion ohne Festlegen der Tabelle als drittes Argument table_name in diesen Beispielen auf die aktuelle (in diesem Fall die interne) Tabelle bezieht.
Beispiel 2
Wenn Sie auf Daten weiter unten in einer Tabelle zugreifen möchten, müssen Sie zwei Schritte durchführen: Laden Sie zuerst die ganze Tabelle in eine temporäre Tabelle und sortieren Sie diese dann anhand von Peek() neu.
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
T1:
LOAD * inline [
ID|Value
1|3
1|4
1|6
3|7
3|8
2|1
2|11
5|2
5|78
5|13
] (delimiter is '|');
T2:
LOAD *,
IF(ID=Peek('ID'), Peek('List')&','&Value,Value) AS List
RESIDENT T1
ORDER BY ID ASC;
DROP TABLE T1;
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
Ergebnistabelle
ID
Liste
Wert
1
3,4
4
1
3,4,6
6
1
3
3
2
1,11
11
2
1
1
3
7,8
8
3
7
7
5
2,78
78
5
2,78,13
13
5
2
2
Der Befehl IF() wird über die temporäre Tabelle T1 ausgeführt. Peek('ID') bezieht sich auf das Feld ID in der vorhergehenden Zeile in der aktuellen Tabelle T2. Peek('List') bezieht sich auf das Feld List in der vorhergehenden Zeile in der Tabelle T2, die derzeit erstellt wird, während die Formel überprüft wird.
Der Befehl liefert folgendes Ergebnis: Wenn der aktuelle Wert von ID mit dem vorhergehenden Wert von ID übereinstimmt, wird der Wert von Peek('List') mit dem aktuellen Wert von Value zusammengefasst. Ansonsten wird nur der aktuelle Wert von Value geschrieben.
Enthält Peek('List') bereits ein zusammengefasstes Ergebnis, wird das neue Ergebnis von Peek('List') damit zusammengefasst.
InformationshinweisBeachten Sie die Bedingung Order by. Diese gibt an, wie die Tabelle sortiert wird (nach ID in aufsteigender Reihenfolge). Ohne diese Bedingung nutzt die Funktion Peek() die beliebige Sortierung der internen Tabelle, was zu unvorhersehbaren Ergebnissen führen kann.
Beispiel 3
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Amounts:
Load
Date#(Month,'YYYY-MM') as Month,
Amount,
Peek(Amount) as AmountMonthBefore
Inline
[Month,Amount
2022-01,2
2022-02,3
2022-03,7
2022-04,9
2022-05,4
2022-06,1];
Ergebnistabelle
Amount
AmountMonthBefore
Monat
1
4
2022-06
2
-
2022-01
3
2
2022-02
4
9
2022-05
7
3
2022-03
9
7
2022-04
Das Feld AmountMonthBefore enthält den Betrag aus dem Vormonat.
Hier werden die Parameter row_no und table_name ausgelassen, sodass die Standardwerte verwendet werden. In diesem Beispiel sind die folgenden drei Funktionsaufrufe äquivalent.
Peek(Amount)
Peek(Amount,-1)
Peek(Amount,-1,'Amounts')
Wenn -1 als row_no verwendet wird, bedeutet dies, dass der Wert aus der vorigen Zeile verwendet wird. Durch Ersetzen dieses Werts können Werte aus anderen Zeilen in der Tabelle abgerufen werden:
Peek(Amount,2) gibt den dritten Wert in der Tabelle zurück: 7.
Beispiel 4
Die Daten müssen korrekt sortiert sein, um das korrekte Ergebnis zu erhalten. Leider ist dies nicht immer der Fall. Zudem kann die Funktion Peek() nicht zum Verweisen auf noch nicht geladene Daten verwendet werden. Mit temporären Tabellen und der Ausführung mehrerer Durchläufe durch die Daten lassen sich derartige Probleme vermeiden.
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
tmp1Amounts:
Load * Inline
[Month,Product,Amount
2022-01,B,3
2022-01,A,8
2022-02,B,4
2022-02,A,6
2022-03,B,1
2022-03,A,6
2022-04,A,5
2022-04,B,5
2022-05,B,6
2022-05,A,7
2022-06,A,4
2022-06,B,8];
tmp2Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthBefore
Resident tmp1Amounts
Order By Product, Month Asc;
Drop Table tmp1Amounts;
Amounts:
Load *,
If(Product=Peek(Product),Peek(Amount)) as AmountMonthAfter
Resident tmp2Amounts
Order By Product, Month Desc;
Drop Table tmp2Amounts;
Erläuterung
Die anfängliche Tabelle ist nach Monat sortiert, was bedeutet, dass die Funktion peek() in vielen Fällen den Betrag für das falsche Produkt zurückgeben würde. Daher muss diese Tabelle neu sortiert werden. Das geschieht durch einen zweiten Durchlauf durch die Daten, mit dem eine neue Tabelle namens „tmp2Amounts“ erstellt wird. Beachten Sie die Bedingung „Order by“. Damit werden die Datensätze zuerst nach Produkt und dann nach Monat in aufsteigender Reihenfolge sortiert.
Die Funktion If() wird benötigt, da AmountMonthBefore nur berechnet werden sollte, wenn die vorherige Zeile die Daten für das gleiche Produkt, aber den Vormonat enthält. Durch Vergleichen des Produkts in der aktuellen Zeile mit dem Produkt in der vorherigen Zeile kann diese Bedingung validiert werden.
Wenn die zweite Tabelle erstellt wird, wird die erste Tabelle tmp1Amounts mit einem „Drop Table“-Befehl gelöscht.
Abschließend erfolgt ein dritter Durchlauf der Daten, aber jetzt werden die Monate in umgekehrter Reihenfolge sortiert. So kann auch AmountMonthAfter berechnet werden.
Informationshinweis„Order by“-Bedingungen geben an, wie die Tabelle sortiert wird. Ohne diese Bedingungen nutzt die Funktion Peek() eine beliebige Sortierung der internen Tabelle, was zu unvorhersehbaren Ergebnissen führen kann.
Ergebnis
Ergebnistabelle
Monat
Produkt
Amount
AmountMonthBefore
AmountMonthAfter
2022-01
A
8
-
6
2022-02
B
3
-
4
2022-03
A
6
8
6
2022-04
B
4
3
1
2022-05
A
6
6
5
2022-06
B
1
4
5
2022-01
A
5
6
7
2022-02
B
5
1
6
2022-03
A
7
5
4
2022-04
B
6
5
8
2022-05
A
4
7
-
2022-06
B
8
6
-
Beispiel 5
Fügen Sie Ihrer App ein Beispielskript hinzu und führen Sie dieses aus. Fügen Sie einem Arbeitsblatt in Ihrer App dann die Felder hinzu, die in der Ergebnisspalte aufgeführt sind, um das Ergebnis anzuzeigen.
Die load-Anweisung Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal umfasst einen rekursiven Aufruf, in dem vorherige Werte zum aktuellen Wert hinzugefügt werden. Dieser Vorgang wird verwendet, um eine Kumulierung von Werten im Skript zu berechnen.
Wenn Sie Probleme mit dieser Seite oder ihren Inhalten feststellen – einen Tippfehler, einen fehlenden Schritt oder einen technischen Fehler –, teilen Sie uns bitte mit, wie wir uns verbessern können!