Exemplo 1
Adicione o script de exemplo ao seu aplicativo e execute-o. Para ver o resultado, adicione os campos listados na coluna de resultados a uma pasta no seu aplicativo.
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 resultanteCódigo do funcionário | 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, pois Peek('EmployeeCode',0, 'EmployeeDates') retorna o primeiro valor de EmployeeCode na tabela EmployeeDates.
LastCode = 106, pois Peek('EmployeeCode',-1, 'EmployeeDates') retorna o último valor de EmployeeCode na tabela EmployeeDates.
Substituindo o valor do argumento, row_no retorna os valores de outras linhas na tabela, conforme a seguir:
O Peek('EmployeeCode',2, 'EmployeeDates') retorna o terceiro valor, 103, na tabela como FirstCode.
No entanto, observe que, sem especificar a tabela como table_name do terceiro argumento nesses exemplos, a função faz referência à tabela atual (neste caso, interna).
Exemplo 2
Se quiser acessar os dados mais abaixo em uma tabela, precisará fazer isso em duas etapas: primeiro, carregue a tabela inteira em uma tabela temporária e, em seguida, classifique-a novamente ao usar Peek().
Adicione o script de exemplo ao seu aplicativo e execute-o. Para ver o resultado, adicione os campos listados na coluna de resultados a uma pasta no seu aplicativo.
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 resultanteID | Lista | Valor |
---|
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 |
O comando IF() é formado a partir da tabela temporária T1.
Peek('ID') referencia o campo ID na linha anterior da tabela atual T2.
Peek('List') referencia o campo List na linha prévia da tabela T2, atualmente sendo criada enquanto a expressão é avaliada.
A instrução é avaliada da seguinte maneira:
Se o valor atual de ID for o mesmo que o valor anterior de ID, escreva o valor de Peek('List') concatenado com o valor atual de Value. Senão, escreva somente o valor atual de Value.
Se Peek('List') já contém um resultado relacionado, o novo resultado de Peek('List') será relacionado a ele.
Nota informativaObserve a cláusula Order by. Ela especifica como a tabela é organizada (por ID em ordem crescente). Sem ela, a função Peek() usará qualquer ordenação arbitrária que a tabela interna possua, que pode acarretar em resultados imprevisíveis.
Exemplo 3
Adicione o script de exemplo ao seu aplicativo e execute-o. Para ver o resultado, adicione os campos listados na coluna de resultados a uma pasta no seu aplicativo.
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 resultanteAmount | 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 |
O campo AmountMonthBefore conterá o valor do mês anterior.
Aqui, os parâmetros row_no e table_name são omitidos e, portanto, os valores padrão são usados. Neste exemplo, as três chamadas de função a seguir são equivalentes:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Usar -1 como row_no significa que o valor da linha anterior será usado. Ao substituir esse valor, os valores de outras linhas na tabela podem ser obtidos:
Peek(Amount,2) retorna o terceiro valor na tabela: 7.
Exemplo 4
Os dados precisam ser classificados corretamente para obter os resultados corretos, mas, infelizmente, esse nem sempre é o caso. Além disso, a função Peek() não pode ser usada para referenciar dados que ainda não foram carregados. Usando tabelas temporárias e executando várias passagens pelos dados, esses problemas podem ser evitados.
Adicione o script de exemplo ao seu aplicativo e execute-o. Para ver o resultado, adicione os campos listados na coluna de resultados a uma pasta no seu aplicativo.
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;
Explicação
A tabela inicial é classificada de acordo com o mês, o que significa que a função peek() em muitos casos retornaria o valor do produto errado. Portanto, essa tabela precisa ser reclassificada. Isso é feito executando uma segunda passagem pelos dados, criando uma nova tabela tmp2Amounts. Observe a cláusula Order by. Ela ordena os registros primeiro por produto e depois por mês, em ordem crescente.
A função If() é necessária, pois AmountMonthBefore só deve ser calculado se a linha anterior contiver os dados para o mesmo produto, mas para o mês anterior. Ao comparar o produto da linha atual com o produto da linha anterior, essa condição pode ser validada.
Quando a segunda tabela é criada, a primeira tabela tmp1Amounts é eliminada usando um comando Drop Table.
Por fim, é feita uma terceira passagem pelos dados, mas agora com os meses classificados em ordem inversa. Dessa forma, AmountMonthAfter também pode ser calculado.
Nota informativaCláusulas Order by especificam como a tabela é ordenada. Sem isso, a função Peek() usará qualquer ordenação arbitrária que a tabela interna tenha, o que pode levar a resultados imprevisíveis.
Resultado
Tabela resultanteMonth | 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 | - |
Exemplo 5
Adicione o script de exemplo ao seu aplicativo e execute-o. Para ver o resultado, adicione os campos listados na coluna de resultados a uma pasta no seu aplicativo.
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;
Resultado
Tabela resultanteTrimestre | 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 |
Explicação
A instrução de LOAD Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal inclui uma chamada recursiva em que os valores anteriores são adicionados ao valor atual. Essa operação é utilizada para calcular um acúmulo de valores no script.