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:
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.
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;
Tabela wynikowa
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.
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.
Tabela wynikowa
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.
InformacjaWarto zwrócić uwagę na klauzulę Order by. Określa ona sposób porządkowania tabeli (rosnąco według ID). Bez niej funkcja Peek() użyje dowolnego porządkowania zawartego w tabeli wewnętrznej, co może prowadzić do nieprzewidywalnych wyników.
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.
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];
Tabela wynikowa
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.
InformacjaPorządkowanie przy użyciu klauzul umożliwia określenie, jak tabela ma być uporządkowana. Bez tego funkcja Peek() użyje dowolnego porządkowania, jakie istnieje w tabeli wewnętrznej, co może prowadzić do nieprzewidywalnych wyników.
Wynik
Tabela wynikowa
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.
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.