Ejemplo 1
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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;
Tabla resultanteCódigo de empleado | 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 porque Peek('EmployeeCode',0, 'EmployeeDates') devuelve el primer valor de EmployeeCode en la tabla EmployeeDates.
LastCode = 106 porque Peek('EmployeeCode',-1, 'EmployeeDates') devuelve el último valor de EmployeeCode en la tabla EmployeeDates.
Al sustituir el valor del argumento row_no, devuelve los valores de otras filas de la tabla, del siguiente modo:
Peek('EmployeeCode',2, 'EmployeeDates') devuelve el tercer valor, 103, de la tabla, como el primer FirstCode.
No obstante, tenga en cuenta que sin especificar la tabla como tercer argumento table_name en estos ejemplos, la función hace referencia a la tabla actual (en este caso, tabla interna).
Ejemplo 2
Si desea acceder a los datos más inferiores de una tabla, debe hacerlo en dos pasos: primero, cargue toda la tabla en una tabla temporal y luego vuelva a ordenarla cuando use Peek().
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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.
Tabla 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 |
La sentencia IF() se crea desde la tabla temporal T1.
Peek('ID') hace referencia al campo ID en la fila anterior en la tabla actual T2.
Peek('List') hace referencia al campo List en la fila anterior de la tabla T2, que se está construyendo a medida que se evalúa la expresión.
La sentencia se evalúa de la siguiente manera:
Si el valor actual de ID es el mismo que el valor anterior de ID, entonces escriba el valor de Peek('List') concatenado con el valor actual de Value. Si no, escriba el valor actual de Value solo.
Si Peek('List') ya contiene un resultado concatenado, el nuevo resultado de Peek('List') se le concatenará.
Nota informativaObserve la cláusula Order by. Esto especifica cómo se ordena la tabla (por ID en orden ascendente). Sin esto, la función Peek() utilizará cualquier orden arbitrario que tenga la tabla interna, lo que puede llevar a resultados impredecibles.
Ejemplo 3
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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];
Tabla 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 |
El campo AmountMonthBefore retendrá el importe del mes anterior.
Aquí, se omiten los parámetros row_no y table_name, por lo que se utilizan los valores predeterminados. En este ejemplo, las siguientes tres llamadas a funciones son equivalentes:
- Peek(Amount)
- Peek(Amount,-1)
- Peek(Amount,-1,'Amounts')
Usar -1 como row_no significa que se usará el valor de la fila anterior. Al sustituir este valor, se pueden recuperar los valores de otras filas de la tabla:
Peek(Amount,2) devuelve el tercer valor de la tabla: 7.
Ejemplo 4
Los datos deben ordenarse correctamente para obtener los resultados correctos pero, desafortunadamente, no siempre es así. Además, la función Peek() no se puede utilizar para hacer referencia a datos que aún no se han cargado. Mediante el uso de tablas temporales y desplazándose varias veces por los datos, se pueden evitar estos problemas.
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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;
Explicación
La tabla inicial está ordenada según el mes, lo que significa que la función peek() en muchos casos devolvería la cantidad del producto incorrecto. De ahí que se deba reordenar esta tabla. Esto se hace en un segundo paso en los datos creando una nueva tabla tmp2Amounts. Observe la cláusula Order by. Ordena los registros primero por producto, luego por mes, en orden ascendente.
La función If() es necesaria ya que AmountMonthBefore solo debe calcularse si la fila anterior contiene los datos del mismo producto pero para el mes anterior. Al comparar el producto de la fila actual con el producto de la fila anterior, se puede validar esta condición.
Cuando se crea la segunda tabla, la primera tabla tmp1Amounts se elimina mediante una instrucción Drop Table.
Finalmente, se realiza una tercera pasada por los datos, pero ahora con los meses ordenados por orden inverso. De esta forma, también se puede calcular AmountMonthAfter.
Nota informativaLas cláusulas Order by especifican cómo se debe ordenar la tabla; sin estas, la función Peek() usaría cualquier orden arbitrario que tenga la tabla interna, lo que puede conducir a resultados impredecibles.
Resultado
Tabla resultanteMonth | Producto | 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 | - |
Ejemplo 5
Agregue el script de ejemplo en su app y ejecútelo. Para ver el resultado, agregue los campos enumerados en la columna de resultados a una hoja de su app.
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
Tabla 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 |
Explicación
La sentencia de carga Load *, rangesum(SumVal,peek('AccSumVal')) as AccSumVal incluye una llamada recursiva donde los valores anteriores se suman al valor actual. Esta operación sirve para calcular una acumulación de valores en el script.