Пример 1.
Добавьте образец скрипта в свое приложение и запустите. Чтобы увидеть результаты, добавьте поля, перечисленные в столбце результатов, в лист приложения.
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;
Результирующая таблицаКод сотрудника | 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, поскольку Peek('EmployeeCode',0, 'EmployeeDates') возвращает первое значение элемента EmployeeCode в таблице EmployeeDates.
LastCode = 106, поскольку Peek('EmployeeCode',-1, 'EmployeeDates') возвращает последнее значение EmployeeCode в таблице EmployeeDates.
Замена значения аргумента row_no возвращает значения других строк в таблице следующим образом:
Peek('EmployeeCode',2, 'EmployeeDates') возвращает третье значение, 103, в таблице в качестве FirstCode:
Тем не менее, обратите внимание, что без указания таблицы в качестве третьего аргумента table_name функция ссылается на текущую (в данном случае внутреннюю) таблицу.
Пример 2.
Если требуется доступ к данным в более низких строчках таблицы, необходимо выполнить два действия: во-первых, загрузить всю таблицу во временную таблицу, а затем выполнить повторную сортировку с помощью Peek().
Добавьте образец скрипта в свое приложение и запустите. Чтобы увидеть результаты, добавьте поля, перечисленные в столбце результатов, в лист приложения.
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.
Результирующая таблицаID | Список | Значение |
---|
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 |
Оператор IF() строится на основе временной таблицы T1.
Peek('ID') ссылается на поле ID в предыдущей строке в текущей таблице T2.
Peek('List') ссылается на поле List в предыдущей строке в таблице T2, которая строится в настоящее время как оценивающееся выражение.
Оператор оценивается следующим образом:
если текущее значение элемента ID такое же, как предыдущее значение элемента ID, то значение элемента Peek('List') записывается как объединенное с текущим значением элемента Value. В противном случае записывается только текущее значение элемента Value.
Если функция Peek('List') уже содержит объединенный результат, новый результат элемента Peek('List') будет объединен с ним.
Примечание к информацииОбратите внимание на предложение Order by. Оно указывает порядок организации таблицы (по ID по возрастанию). Без этого функция Peek() будет использовать тот обязательный порядок, который указан во внутренней таблице, что может привести к непредсказуемым результатам.
Пример 3
Добавьте образец скрипта в свое приложение и запустите. Чтобы увидеть результаты, добавьте поля, перечисленные в столбце результатов, в лист приложения.
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];
Результирующая таблицаAmount | AmountMonthBefore | Месяц |
---|
1 | 4 | 2022-06 |
2 | - | 2022-01 |
3 | 2 | 2022-02 |
4 | 9 | 2022-05 |
7 | 3 | 2022-03 |
9 | 7 | 2022-04 |
Поле AmountMonthBefore не будет содержать сумму за предыдущий месяц.
Здесь параметры row_no и table_name отброшены, поэтому используются значения по умолчанию. В этом примере следующие три вызова функции являются эквивалентными:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Значение -1 для параметра row_no указывает, что будет использоваться значение из предыдущей строки. В результате замены этого значения можно извлечь значения других строк таблицы:
Peek(Amount,2) возвращает третье значение в таблице: 7.
Пример 4
Данные необходимо правильно сортировать для получения правильных результатов, но, к сожалению, это не всегда выполняется. Функцию Peek() нельзя использовать для указания ссылки на данные, которые еще не загружены. Такие проблемы можно предотвратить, используя временные таблицы и выполняя несколько обходов данных.
Добавьте образец скрипта в свое приложение и запустите. Чтобы увидеть результаты, добавьте поля, перечисленные в столбце результатов, в лист приложения.
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;
Объяснение
Первоначальная таблица сортируется по месяцу, таким образом функция peek() во многих случаях будет возвращать сумму для неправильного продукта. Таким образом, данную таблицу потребуется сортировать повторно. Это осуществляется путем выполнения второго обхода данных, в рамках которого создается новая таблица tmp2Amounts. Обратите внимание на предложение Order by. Оно упорядочивает записи сначала по продукту, затем по месяцу в восходящем порядке.
Необходимо использовать функцию If(), так как AmountMonthBefore следует рассчитывать, только если предыдущая строка содержит данные для того же продукта, но за предыдущий месяц. Это условие можно проверить путем сравнения продукта в текущей строке с продуктом в предыдущей строке.
Когда создается вторая таблица, первая таблица tmp1Amounts отбрасывается с использованием оператора Drop Table.
В заключение, выполняется третий проход по данным, но теперь с сортировкой месяцев в обратном порядке. Таким образом также можно рассчитать AmountMonthAfter.
Примечание к информацииПредложения Order by указывают, как упорядочивается таблица. Без этого функция Peek() будет использовать любой произвольный порядок, который указан во внутренней таблице, что может привести к непредсказуемым результатам.
Результат
Результирующая таблицаМесяц | Продукт | 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 | - |
Пример 5
Добавьте образец скрипта в свое приложение и запустите. Чтобы увидеть результаты, добавьте поля, перечисленные в столбце результатов, в лист приложения.
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;
Результат
Результирующая таблицаКвартал | 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 |
Объяснение
Оператор загрузки Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal включает рекурсивный вызов, где предыдущие значения добавляются к текущему значению. Эта операция служит для расчета аккумуляции значений в скрипте.