Peek - função de script
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:
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.
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.
Create a table in a sheet in your app with ID, List, and Value as the dimensions.
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.
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.
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.
Resultado
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.
Resultado
Trimestre | 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.