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 wynikowaKod 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 wynikowaIdentyfikator | 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 wynikowaAmount | 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 wynikowaMiesią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.
T1:
Load * inline [
Quarter, Value
2003q1, 10000
2003q1, 25000
2003q1, 30000
2003q2, 1250
2003q2, 55000
2003q2, 76200
2003q3, 9240
2003q3, 33150
2003q3, 89450
2003q4, 1000
2003q4, 3000
2003q4, 5000
2004q1, 1000
2004q1, 1250
2004q1, 3000
2004q2, 5000
2004q2, 9240
2004q2, 10000
2004q3, 25000
2004q3, 30000
2004q3, 33150
2004q4, 55000
2004q4, 76200
2004q4, 89450 ];
T2:
Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal;
Load Quarter, sum(Value) as SumVal resident T1 group by Quarter;
Wynik
Tabela wynikowaKwartał | 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.