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 campoespecí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.
Peek(
field_name
[, row_no[, table_name ] ])
Tipo de dados de retorno: Dual
| 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 denota 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. |
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.
| Employee code | 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 application 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 |
A IF() instrução é construída a partir da tabela temporária T1.
Peek('ID') referencia o campo ID na linha anterior na tabela atual T2.
Peek('List') referencia o campo List na linha anterior na tabela T2, atualmente sendo construída enquanto a expressão é avaliada.
A instrução é avaliada da seguinte forma:
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
| 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 |
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.