Peek() returnerar värdet för ett fält i en tabell för en rad som redan har laddats. Radnumret kan anges, liksom tabellen. Om inget radnummer anges används posten som laddades senast.
Peek()-funktionen används vanligen för att hitta de relevanta gränserna i en tidigare laddad tabell, det vill säga det första eller sista värdet i ett specifikt fält. I de flesta fall lagras det här värdet i en variabel för att användas senare, till exempel som ett villkor i en do-while-loop.
Syntax:
Peek(
field_name
[, row_no[, table_name ] ])
Returnerad datatyp: dual
Argument:
Argument
Argument
Beskrivning
field_name
Namnet på det fält för vilket returvärdet krävs.Inmatat värde måste anges som en sträng (t ex en litteral inom citationstecken).
row_no
Den rad i tabellen som anger det fält som krävs. Kan vara ett uttryck, men måste lösas till ett heltal. 0 anger första posten, 1 andra posten o.s.v. Negativa tal markerar ordningen från slutet av tabellen. -1 anger den senaste lästa posten.
Om ingen row_no angivits, antas -1.
table_name
En tabelletikett utan avslutande kolon. Om inget table_name har angetts antas den aktuella tabellen. Om det används utanför LOAD-satsen, eller refererar till en annan tabell, måste tabellnamnet table_name anges.
Begränsningar:
Funktionen kan bara returnera värden från poster som redan laddats. Det betyder att ett anrop som använder -1 som row_no kommer att returnera NULL för den första posten i en tabell.
Exempel 1
Lägg till exempelskriptet i appen och kör det. När du vill se resultatet lägger du till de fält som anges i resultatkolumnen i ett ark i din app.
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;
Resultattabell
Employee code
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, eftersom Peek('EmployeeCode',0, 'EmployeeDates') returnerar det första värdet för EmployeeCode i tabellen EmployeeDates.
LastCode = 106, eftersom Peek('EmployeeCode',-1, 'EmployeeDates') returnerar det sista värdet för EmployeeCode i tabellen EmployeeDates.
Att ersätta värdet på argumentet row_no returnerar värdena för andra rader i tabellen, enligt följande:
Peek('EmployeeCode',2, 'EmployeeDates') returnerar det tredje värdet, 103, i tabellen som FirstCode.
Observera dock att om inte tabellen specificeras som det tredje argumentet table_name i dessa exempel, refererar funktionen till den aktuella tabellen (i detta fall, internt).
Exempel 2
Om du vill komma åt data längre ned i en tabell kan du göra det i två steg: först laddar du hela tabellen i en temporär tabell och sedan sorterar du om den med användning av Peek().
Lägg till exempelskriptet i appen och kör det. När du vill se resultatet lägger du till de fält som anges i resultatkolumnen i ett ark i din app.
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.
Resultattabell
ID
Lista
Värde
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
Satsen IF() byggs från den tillfälliga tabellen T1. Peek('ID') hänvisar till fältet ID i föregående rad i aktuell tabell T2. Peek('List') hänvisar till fältet List i föregående rad i tabellen T2, som byggs då uttrycket utvärderas.
Satsen utvärderas enligt följande: Om det aktuella värdet för ID är samma som det tidigare värdet för ID, då ska värdet för Peek('List') skrivas sammanlänkat med det aktuella värdet för Value. Annars skriver du det aktuella värdet av Value endast.
Om Peek('List') redan innehåller ett sammanlänkat resultat, kommer det nya resultatet Peek('List') sammanlänkas till det.
Anteckning om informationObservera satsen Order by. Detta anger hur tabellen ordnas (genom ID i stigande ordning). Utan detta använder funktionen Peek() godtycklig ordning som den interna tabellen har, vilket kan leda till oförutsägbara resultat.
Exempel 3
Lägg till exempelskriptet i appen och kör det. När du vill se resultatet lägger du till de fält som anges i resultatkolumnen i ett ark i din app.
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];
Resultattabell
Amount
AmountMonthBefore
Månad
1
4
2022-06
2
-
2022-01
3
2
2022-02
4
9
2022-05
7
3
2022-03
9
7
2022-04
Fältet AmountMonthBefore kommer att innehålla mängden från föregående månad.
Eftersom parametrarna row_no och table_name är utelämnade, används standardvärdena. I det här exemplet är följande tre funktionsanrop likvärdiga:
Peek(Amount)
Peek(Amount,-1)
Peek(Amount,-1,'Amounts')
När -1 används som row_no kommer värdet från föregående rad att användas. Genom att ersätta det här värdet går det att hämta värden för de andra raderna i tabellen:
Peek(Amount,2) returnerar det tredje värdet i tabellen: 7.
Exempel 4
Data måste vara korrekt sorterade för att få rätt resultat men det är tyvärr inte alltid fallet. Funktionen Peek() kan inte användas för att hänvisa till data som inte har laddats än. Du kan undvika sådana problem genom att använda temporära tabeller och köra flera pass för dina data.
Lägg till exempelskriptet i appen och kör det. När du vill se resultatet lägger du till de fält som anges i resultatkolumnen i ett ark i din app.
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;
Förklaring
Den inledande tabellen är sorterad på månad. Det betyder att peek()-funktionen i många fall skulle returnera mängden för fel produkt. Det innebär att tabellen måste sorteras om. Detta utförs genom att köra ett andra pass för dina data och skapa den nya tabellen tmp2Amounts. Observera satsen Order By. Först ordnar den posterna efter produkt och därefter efter månad i stigande ordning.
If()-funktionen behövs eftersom AmountMonthBefore endast ska beräknas om den föregående raden innehåller data för samma produkt men bara för den föregående månaden. Genom att jämföra produkten på den aktuella raden med produkten på föregående rad kan det här villkoret valideras.
När den andra tabellen har skapats skippas den första tabellen tmp1Amounts med en Drop Table-sats.
Slutligen körs ett tredje pass för data, men nu med månaderna sorterade i omvänd ordning. Det betyder att även AmountMonthAfter kan beräknas.
Anteckning om informationOrder By-satser anger hur tabellen ska ordnas. Utan detta använder funktionen Peek() en godtycklig ordning som den interna tabellen har, vilket kan leda till oförutsägbara resultat.
Resultat
Resultattabell
Månad
Produkt
Amount
AmountMonthBefore
AmountMonthAfter
2022-01
En
8
-
6
2022-02
B
3
-
4
2022-03
En
6
8
6
2022-04
B
4
3
1
2022-05
En
6
6
5
2022-06
B
1
4
5
2022-01
En
5
6
7
2022-02
B
5
1
6
2022-03
En
7
5
4
2022-04
B
6
5
8
2022-05
En
4
7
-
2022-06
B
8
6
-
Exempel 5
Lägg till exempelskriptet i appen och kör det. När du vill se resultatet lägger du till de fält som anges i resultatkolumnen i ett ark i din app.
Load-satsen Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal har ett rekursivt anrop där de tidigare värdena läggs till i det aktuella värdet. Den här åtgärden används till att beräkna en ackumulering av värden i skriptet.
Om du hittar några fel på denna sida eller i innehållet – ett stavfel, ett steg som saknas eller ett tekniskt fel – berätta för oss så att vi kan blir bättre!