Peek — funkcja skryptu
Peek() wyszukuje wartość pola w tabeli z wiersza, który został już załadowany. Numer wiersza może być określony, podobnie jak tabela. Jeśli nie określono numeru wiersza, zostanie użyty ostatnio załadowany rekord.
Funkcja peek() służy najczęściej do znajdowania odpowiednich granic we wcześniej załadowanej tabeli, czyli pierwszej lub ostatniej wartości określonego pola. W większości przypadków ta wartość jest przechowywana w zmiennej do późniejszego wykorzystania, na przykład jako warunek w pętli do-while.
Składnia:
Peek(
field_name
[, row_no[, table_name ] ])
Typ zwracanych danych: dual
Argumenty:
Argument | Opis |
---|---|
field_name | Nazwa pola, dla którego wymagana jest wartość zwracana.Wartość wejściowa musi być podana jako ciąg znaków (np. jako literał w cudzysłowie). |
row_no |
Wiersz w tabeli określający wymagane pole. Może być wyrażeniem, ale musi dawać w wyniku liczbę całkowitą. 0 oznacza pierwszy rekord, 1 drugi rekord itd. Liczby ujemne określają kolejność od końca tabeli. –1 oznacza ostatni wczytany rekord. Jeśli argument row_no nie zostanie podany, przyjmowana jest wartość –1. |
table_name | Etykieta tabeli bez końcowego dwukropka. Jeśli argument table_name nie zostanie podany, przyjmowana jest bieżąca tabela. Wartość table_name musi być podana w przypadku użycia poza instrukcją LOAD lub odnoszenia się do innej tabeli. |
Ograniczenia:
Funkcja ta może zwracać tylko wartości z już załadowanych rekordów. Oznacza to, że w pierwszym rekordzie tabeli wywołanie używające -1 jako row_no zwróci NULL.
Przykład 1:
Dodaj skrypt przykładowy do aplikacji i uruchom ją. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
Kod pracownika | 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, ponieważ Peek('EmployeeCode',0, 'EmployeeDates') zwraca pierwszą wartość EmployeeCode w tabeli EmployeeDates.
LastCode = 106, ponieważ Peek('EmployeeCode',-1, 'EmployeeDates') zwraca ostatnią wartość EmployeeCode w tabeli EmployeeDates.
Podstawienie wartości argumentu row_no zwraca wartości innych wierszy w tabeli w następujący sposób:
Peek('EmployeeCode',2, 'EmployeeDates') zwraca trzecią wartość w tabeli, 103, jako FirstCode.
Należy jednak pamiętać, że bez określenia tabeli jako trzeciego argumentu table_name w tych przykładach funkcja odwołuje się do bieżącej tabeli (w tym przypadku — wewnętrznej).
Przykład 2
Aby uzyskać dostęp do danych znajdujących się dalej w tabeli, należy to zrobić w dwóch krokach: najpierw załaduj całą tabelę do tabeli tymczasowej, a następnie posortuj ją ponownie podczas używania funkcji Peek().
Dodaj skrypt przykładowy do aplikacji i uruchom ją. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
Identyfikator | Lista | Wartość |
---|---|---|
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 |
Instrukcja IF() jest tworzona z tabeli tymczasowej T1.
Peek('ID') odwołuje się do pola ID w poprzednim wierszu w bieżącej tabeli T2.
Peek('List') odwołuje się do pola List w poprzednim wierszu w tabeli T2, która obecnie jest tworzona podczas oceny wyrażenia.
Wartość instrukcji jest wyznaczana w następujący sposób:
Jeśli bieżąca wartość ID jest taka sama jak poprzednia wartość ID, należy zapisać wartość Peek('List') skonkatenowaną z bieżącą wartością Value. W przeciwnym wypadku należy zapisać tylko bieżącą wartość Value.
Jeśli funkcja Peek('List') już zawiera skonkatenowany wynik, nowy wynik Peek('List') będzie z nim skonkatenowany.
Przykład 3
Dodaj skrypt przykładowy do aplikacji i uruchom ją. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
Amount | AmountMonthBefore | Miesiąc |
---|---|---|
1 | 4 | 2022-06 |
2 | - | 2022-01 |
3 | 2 | 2022-02 |
4 | 9 | 2022-05 |
7 | 3 | 2022-03 |
9 | 7 | 2022-04 |
W polu AmountMonthBefore będzie przechowywana kwota z poprzedniego miesiąca.
W tym przypadku parametry row_no i table_name są pomijane, więc używane są wartości domyślne. W tym przykładzie następujące trzy wywołania funkcji są równoważne:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Użycie -1 jako row_no oznacza, że zostanie użyta wartość z poprzedniego wiersza. Podstawiając tę wartość, można pobrać wartości innych wierszy w tabeli:
Peek(Amount,2) zwraca trzecią wartość w tabeli: 7.
Przykład 4
Aby można było uzyskać prawidłowe wyniki, dane muszą być poprawnie posortowane, ale niestety nie zawsze tak jest. Ponadto funkcja Peek() nie może być używana w celu utworzenia odniesienia do danych, które nie zostały jeszcze załadowane. Problemów takich można uniknąć, korzystając z tabel tymczasowych i uruchamiając wiele przejść przez dane.
Dodaj skrypt przykładowy do aplikacji i uruchom ją. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
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;
Objaśnienie
Początkowa tabela jest posortowana według miesięcy, co oznacza, że funkcja peek() w wielu przypadkach zwróciłaby kwotę za niewłaściwy produkt. Dlatego należy ponownie posortować tę tabelę. W tym celu uruchamia się drugie przejście przez dane, tworząc nową tabelę tmp2Amounts. Warto zwrócić uwagę na klauzulę Order by. Porządkuje ona rekordy najpierw według produktu, a następnie według miesiąca w porządku rosnącym.
Funkcja If() jest potrzebna, ponieważ AmountMonthBefore należy obliczyć tylko wtedy, gdy poprzedni wiersz zawiera dane dotyczące tego samego produktu, ale za poprzedni miesiąc. Porównując produkt w bieżącym wierszu z produktem w poprzednim wierszu, można zweryfikować ten warunek.
Po utworzeniu drugiej tabeli pierwsza tabela tmp1Amounts jest usuwana za pomocą instrukcji Drop Table.
Na koniec następuje trzecie przejście przez dane, ale tym razem z miesiącami posortowanymi w kolejności odwrotnej. W ten sposób można również obliczyć AmountMonthAfter.
Wynik
Miesiąc | Produkt | Amount | AmountMonthBefore | AmountMonthAfter |
---|---|---|---|---|
2022-01 | Symbol | 8 | - | 6 |
2022-02 | B | 3 | - | 4 |
2022-03 | Symbol | 6 | 8 | 6 |
2022-04 | B | 4 | 3 | 1 |
2022-05 | Symbol | 6 | 6 | 5 |
2022-06 | B | 1 | 4 | 5 |
2022-01 | Symbol | 5 | 6 | 7 |
2022-02 | B | 5 | 1 | 6 |
2022-03 | Symbol | 7 | 5 | 4 |
2022-04 | B | 6 | 5 | 8 |
2022-05 | Symbol | 4 | 7 | - |
2022-06 | B | 8 | 6 | - |
Przykład 5
Dodaj skrypt przykładowy do aplikacji i uruchom ją. Aby zobaczyć wynik, dodaj do arkusza w swojej aplikacji pola wyszczególnione w kolumnie wyników.
Wynik
Kwartał | 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 |
Objaśnienie
Instrukcja LOAD Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal zawiera wywołanie rekursywne, w którym poprzednie wartości są dodawane do wartości bieżącej. Ta operacja służy do obliczania akumulacji wartości w skrypcie.