Tengo un conjunto de datos donde me gustaría calcular la media de las últimas 3 observaciones para cada fecha y tener ese valor en su propia columna y emparejado con la última fecha como se muestra a continuación.
Names Default To Here( 1 );
// Create an example data table
dt = New Table( "Date",
Add Rows( 30 ),
New Column( "Date",
Numeric,
"Continuous",
Format( "m/d/y", 10 ),
Set Values( [3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600, 3713817600,
3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200, 3715027200,
3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800, 3716236800] )
),
New Column( "Data",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [2,4,6,8,10,12,14,16,18,20,2,4,6,8,10,12,14,26,28,30,2,4,6,8,10,12,14,36,38,40] )
),
New Column( "Desired Result",
Numeric,
"Continuous",
Format( "Best", 12 ),
Set Values( [.,.,.,.,.,.,.,.,.,18,.,.,.,.,.,.,.,.,.,28,.,.,.,.,.,.,.,.,.,38] )
),
);
Si bien puedo crear una tabla de resumen que calcule la media y luego insertar la media nuevamente en la tabla de datos original, estoy buscando una sugerencia para un método más elegante y menos intensivo en procesos.Se agradecería cualquier sugerencia sobre cómo lograr esto, ya sea como una fórmula de columna o mediante JSL (preferido).
También puedo abrir un poco mi solución ya que las funciones de Col pueden ser bastante poderosas. Echa un vistazo a la explicación cuando tengas tiempo:
- Utilice Col Max(Row(), :Date) para obtener la última fila para cada fecha
- Verifique con la declaración if con Row() la última fila para la fecha
- Utilice Media para calcular la media de las últimas tres filas de una fecha. Index(Row() - 2, Col Max(Row(), :Date) crea una matriz de números de fila. Y luego con:Data[Index] podemos obtener valores para esos números de fila
He adjuntado una tabla de datos en la que la fórmula está dividida en partes.

Gracias por la sugerencia, especialmente una que puedo entender fácilmente.Tendré que profundizar más en la sugerencia de jthi ya que la solución no es tan intuitiva para mí como la suya.
Otra opción con fórmula:
If(Row() == Col Max(Row(), :Date),
Mean(:Data[Index(Row() - 2, Col Max(Row(), :Date))])
)
Aquí hay una forma de escribir la fórmula para hacer esto.
If( :Date != :Date[Row() + 1] | Row() == N Rows( Current Data Table() ),
Mean( :Data[Row()], :Data[Row() - 1], :Data[Row() - 2] )
)