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.
Funktionen Peek() 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.
Peek(
field_name
[, row_no[, table_name ] ])
Returnerad datatyp: Dual
| 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 betecknar den första posten, 1 den andra, och så vidare. 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. |
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 din applikation och kör det. När du vill se resultatet lägger du till fälten som listas i resultatkolumnen i ett ark i din applikation.
| 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 din applikation och kör det. När du vill se resultatet lägger du till fälten som listas i resultatkolumnen i ett ark i din applikation.
Create a table in a sheet in your application 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 |
Uttrycket IF() byggs från den temporära tabellen T1.
Peek('ID') hänvisar till fältet ID i föregående rad i den aktuella tabellen T2.
Peek('List') hänvisar till fältet List i föregående rad i tabellen T2, som byggs då uttrycket utvärderas.
Uttrycket utvärderas på följande sätt:
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') sammanlänkas 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 din applikation och kör det. När du vill se resultatet lägger du till fälten som listas i resultatkolumnen i ett ark i din applikation.
| Amount | AmountMonthBefore | Month |
|---|---|---|
| 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 din applikation och kör det. När du vill se resultatet lägger du till fälten som listas i resultatkolumnen i ett ark i din applikation.
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
| Month | Product | 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 | - |
Exempel 5
Lägg till exempelskriptet i din applikation och kör det. När du vill se resultatet lägger du till fälten som listas i resultatkolumnen i ett ark i din applikation.
Resultat
| Quarter | 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.