Peek - skriptfunktion
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 | 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.
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.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
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.
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.
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.
Resultat
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.
Resultat
Kvartal | SumVal | AccSumVal |
---|---|---|
2003q1 | 65000 | 65000 |
2003q2 | 132450 | 197450 |
2003q3 | 131840 | 329290 |
2003q4 | 9000 | 338290 |
2004q1 | 5250 | 343540 |
2004q2 | 24240 | 367780 |
2004q3 | 88150 | 455930 |
2004q4 | 220650 | 676580 |
Förklaring
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.