Peek() retorna o valor de um campo em uma tabela para uma linha que já foi carregada. O número da linha pode ser especificado, assim como a tabela. Se nenhum número de linha for especificado, o último registro carregado anteriormente será usado.
A função peek() é mais frequentemente usada para encontrar os limites relevantes em uma tabela carregada anteriormente, ou seja, o primeiro valor ou o último valor de um campo específico. Na maioria dos casos, esse valor é armazenado em uma variável para uso posterior, por exemplo, como uma condição em um loop do-while.
Sintaxe:
Peek(
field_name
[, row_no[, table_name ] ])
Tipo de dados de retorno: dual
Argumentos:
Argumentos
Argumento
Descrição
field_name
Nome do campo para o qual o valor de retorno é exigido.O valor de entrada deve ser fornecido como uma string (por exemplo, literais entre aspas).
row_no
A linha na tabela que especifica o campo obrigatório. Pode ser uma expressão, mas deve solucionar-se em um número inteiro. 0 indica o primeiro registro; 1, o segundo; e assim por diante. Números negativos indicam a ordem no final da tabela. -1 representa o último registro lido.
Se nenhuma row_no for definida, assume-se -1.
table_name
Um rótulo de tabela sem os dois-pontos finais. Se nenhum table_namefor definido, a tabela atual será assumida. Se usado fora do comando LOAD ou em referência a outra tabela, o table_name deve ser incluído.
Limitações:
A função só pode retornar valores de registros já carregados. Isso significa que, no primeiro registro de uma tabela, uma chamada usando -1 como row_no retornará NULL.
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 resultante
Có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 resultante
ID
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 resultante
Amount
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 resultante
Month
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.
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.
Se você encontrar algum problema com esta página ou seu conteúdo - um erro de digitação, uma etapa ausente ou um erro técnico - informe-nos como podemos melhorar!