martes, 28 de septiembre de 2021

Diferencia con dato anterior condicionado

Un clásico de los procesos de cálculo es obtener la diferencia de un valor respecto a su equivalente previo o anterior... este delta o diferencia entre filas nos aporta normalmente variaciones de consumo o sencillamente incrementos/decrementos de una variable.

Hoy veremos cómo conseguir con fórmulas esos datos para cada fila con fórmulas estándar de nuestra hoja de cálculo.
Además, como no, añadiremos un punto de dificultad, ya que no será necesario la ordenación previa de los datos... y para rematar, nuestras diferencias se calcularán teniendo en cuenta una condición de 'País' (de cualquier cosa en realidad).
Un punto de partida importante a tener presente: Las combinaciones de país-fecha sobre las que trabajaremos deben ser únicas!!
Diferencia con dato anterior condicionado

Las funciones que vamos a emplear son las ya conocidas:
LET
FILTRAR
ORDENARPOR
y las clásicas:
INDICE
COINCIDIR

y nuestro SI condicional
Funciones todas ellas vistas en el blog (busca en la categoría de funciones)

Sobre nuestra tabla en la hoja de cálculo (sin ningún tipo de orden por 'País' o 'Fecha', añadimos un nuevo campo con la siguiente fórmula:
=LET(TblOrdenado;ORDENARPOR(TblDATOS;[Fecha];1);
oPais;INDICE(TblOrdenado;0;1);
oFecha;INDICE(TblOrdenado;0;2);
oImporte;INDICE(TblOrdenado;0;3);
fImportes;FILTRAR(oImporte;(oPais=[@País]));
fFechas;FILTRAR(oFecha;(oPais=[@País]));
Pos;COINCIDIR($B2;fFechas;0)-1;
SI(Pos=0;"";INDICE(fImportes;Pos+1)-INDICE(fImportes;Pos)))
Diferencia con dato anterior condicionado

La explicación de la fórmula es simple... Y más al apoyarnos en el uso de la función LET.
En primer lugar ordenamos en sentido ascendente la Tabla empleando el campo 'Fecha' como criterio...
OJO!!, no es una ordenación física o real sobre la hoja de cálculo... se realiza a nivel interno de la fórmula ;-)
TblOrdenado;ORDENARPOR(TblDATOS;[Fecha];1);
queda asociada a nuestra variable 'tblOrdenado'.

En el segundo paso, sobre la tabla ordenada, asignamos nuevas variables a cada uno de los campos sobre los que vamos a trabajar:
oPais;INDICE(TblOrdenado;0;1);
oFecha;INDICE(TblOrdenado;0;2);
oImporte;INDICE(TblOrdenado;0;3);
con esto recuperamos los tres campos implicados...

En el tercer paso segmentamos, con la función FILTRAR, registros coincidentes con el 'País':
fFechas;FILTRAR(oFecha;(oPais=[@País]));
con lo que obtendríamos un listado de fechas para cada 'país' previamente ordenado en sentido ascendente

El penúltimo paso es clave:
Pos;COINCIDIR($B2;fFechas;0)-1;
nos permite obtener la posición, de entre las fechas del 'país' correspondiente, que ocupa la fecha anterior!!

Posición necesaria para el último paso:
SI(Pos=0;"";INDICE(fImportes;Pos+1)-INDICE(fImportes;Pos))
donde nuestro condicional gestiona que dato, de entre los 'Importes' queremos restar; esto es, el corriente menos el previo (teniendo en cuenta las lfechas y el 'País').

Quizá el resultado obtenido te resulte 'difícil' de analizar... pero si, a efectos de comprobación, ordenas por 'País' y 'Fecha' y restas directamente uno menos el previo comprobarás la exactitud del cálculo.

Para facilitar la comprensión, y basada en la fórmula anterior, he incorporado otra fórmula que devuelve el ordinal de cada registro según 'País' y 'Fecha':
=LET(TblOrdenado;ORDENARPOR(TblDATOS;[Fecha];1);
oPais;INDICE(TblOrdenado;0;1);
oFecha;INDICE(TblOrdenado;0;2);
oImporte;INDICE(TblOrdenado;0;3);
fImportes;FILTRAR(oImporte;(oPais=[@País]));
fFechas;FILTRAR(oFecha;(oPais=[@País]));
Pos;COINCIDIR($B2;fFechas;0)-1;
Pos)


Nuevamente la función LET, FILTRAR, ORDENARPOR... (disponible para versiones 365) nos facilitan y ayudan en cálculos, que de otra forma, se nos antojan algo más elaborados...

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.