Precio más reciente por artículo: REDUCE, AGRUPARPOR y números complejos
Nuevo reto interesante planteado por Miki: dada una tabla con artículos y sus precios históricos por año (múltiples filas por artículo), obtener el precio más reciente de cada uno con una sola fórmula.
La comunidad respondió con al menos 5 enfoques distintos, desde soluciones directas hasta una técnica verdaderamente inusual con números complejos.
Solución 1: ORDENARPOR + MAP (Miki)
Miki propuso ordenar primero por artículo ascendente y año descendente, y luego usar MAP para quedarse solo con la primera aparición de cada artículo:
``
=LET(
a; ORDENARPOR(Ejemplo; Ejemplo[Articulo]; 1; Ejemplo[Año]; -1);
b; MAP(SECUENCIA(FILAS(a)); LAMBDA(x;
SUMA(--(TOMAR(ELEGIRCOLS(a; 1); x) = INDICE(ELEGIRCOLS(a; 1); x)))
));
FILTRAR(a; b = 1)
)
`
La clave está en contar cuántas veces ha aparecido cada artículo hasta la fila actual. Si es 1, es la primera aparición (y como están ordenados por año descendente, es el precio más reciente).
Solución 2: REDUCE + UNICOS
Un enfoque más directo: iterar sobre los artículos únicos, filtrar cada uno, ordenar por año descendente y tomar solo la primera fila:
`
=LET(
_f; Ejemplo[Articulo];
EXCLUIR(
REDUCE(0; UNICOS(_f); LAMBDA(a; v;
APILARV(a; TOMAR(ORDENAR(FILTRAR(Ejemplo; _f = v); 2; -1); 1))
));
1
)
)
`
Limpio, legible y fácil de adaptar. EXCLUIR(…; 1) elimina el 0 inicial del REDUCE.
Solución 3: John (3 opciones en fichero adjunto)
John compartió un fichero con tres variantes adicionales. Como él mismo dijo: "¡Bendiciones!"
Solución 4: Gerson (más alternativas)
Gerson aportó su propio fichero con alternativas adicionales usando combinaciones de LET, LAMBDA y funciones de filtrado.
Solución 5: AGRUPARPOR + números complejos (Leo)
La solución más creativa de la semana. Leo usó números complejos (COMPLEJO, IM.REAL, IMAGINARIO) para codificar dos valores (año y precio) en un único número complejo, y así poder arrastrar ambos a través del LAMBDA de AGRUPARPOR:
`
=APILARV(
B3:D3;
EXCLUIR(
AGRUPARPOR(
B4:B316;
APILARH(C4:C316; COMPLEJO(+C4:C316; SI.ERROR(D4:D316; )));
APILARH(MAX; LAMBDA(x;
BUSCARX(MAX(IM.REAL(x)); IM.REAL(x); IMAGINARIO(x))
));;
0
);
1
)
)
`
La parte real del complejo guarda el año y la imaginaria el precio. AGRUPARPOR agrupa por artículo, y el LAMBDA personalizado busca el complejo con mayor parte real (año más reciente) y extrae su parte imaginaria (el precio correspondiente).
Como Leo reconoció, no es la opción más práctica para este problema concreto, pero la técnica de empaquetar múltiples valores en un número complejo es trasladable a cualquier escenario donde necesites más de un acumulador en un LAMBDA`.
El problema: quedarse solo con el precio más reciente
Miki planteó un reto muy común. Tienes una tabla con artículos y sus precios históricos por año —varias filas por artículo— y quieres obtener, con una sola fórmula, el precio más reciente de cada uno. La comunidad respondió con al menos cinco enfoques distintos, desde lo directo hasta una técnica francamente inusual con números complejos.
Enfoque 1: ORDENARPOR + MAP
Miki ordena primero por artículo ascendente y año descendente, y luego se queda con la primera aparición de cada artículo:
`` =LET( a; ORDENARPOR(Ejemplo; Ejemplo[Articulo]; 1; Ejemplo[Año]; -1); b; MAP(SECUENCIA(FILAS(a)); LAMBDA(x; SUMA(N(TOMAR(ELEGIRCOLS(a; 1); x) = INDICE(ELEGIRCOLS(a; 1); x))) )); FILTRAR(a; b = 1) ) ``
La clave está en contar cuántas veces ha aparecido cada artículo hasta la fila actual. Si el conteo es 1, es la primera aparición y, como están ordenados por año descendente, es el precio más reciente. El N(...) convierte los VERDADERO/FALSO en 1 y 0 para poder sumarlos (es la forma limpia de la típica doble negación).
Enfoque 2: REDUCE + UNICOS
Más directo: itera sobre los artículos únicos, filtra cada uno, ordena por año descendente y toma la primera fila:
`` =LET( _f; Ejemplo[Articulo]; EXCLUIR( REDUCE(0; UNICOS(_f); LAMBDA(a; v; APILARV(a; TOMAR(ORDENAR(FILTRAR(Ejemplo; _f = v); 2; -1); 1)) )); 1 ) ) ``
EXCLUIR(…; 1) elimina el 0 inicial que arrastra el REDUCE. Es limpio, legible y fácil de adaptar.
Enfoque 3 y 4: variantes de la comunidad
John compartió un fichero con tres variantes adicionales y Gerson aportó otras más, combinando LET, LAMBDA y funciones de filtrado. Es habitual en la comunidad: un mismo problema termina con media docena de soluciones sobre la mesa.
Enfoque 5: AGRUPARPOR + números complejos
La joya creativa de la semana la firmó Leo. Usó números complejos para empaquetar dos valores (año y precio) en un único número y poder arrastrar ambos a través del LAMBDA de AGRUPARPOR:
`` =APILARV( B3:D3; EXCLUIR( AGRUPARPOR( B4:B316; APILARH(C4:C316; COMPLEJO(+C4:C316; SI.ERROR(D4:D316; ))); APILARH(MAX; LAMBDA(x; BUSCARX(MAX(IM.REAL(x)); IM.REAL(x); IMAGINARIO(x)) ));; 0 ); 1 ) ) ``
La parte real del complejo guarda el año y la imaginaria el precio. AGRUPARPOR agrupa por artículo y el LAMBDA personalizado busca el complejo con mayor parte real (el año más reciente) y extrae su parte imaginaria (el precio correspondiente).
Como reconoció el propio Leo, no es la opción más práctica para este problema concreto. Pero la técnica —meter varios valores en un único número complejo para tener más de un acumulador dentro de un LAMBDA— es trasladable a un montón de escenarios donde un solo acumulador se te queda corto.
Funciones clave
ORDENARPORyORDENAR: colocan el año más reciente arriba de cada grupo.AGRUPARPOR: agrupa por artículo y admite unaLAMBDAde agregación a medida.REDUCE+APILARV: recorren los únicos y van apilando resultados.COMPLEJO,IM.REAL,IMAGINARIO: empaquetan y desempaquetan dos valores en uno.N: coacciona booleanos a números sin la doble negación.
Conclusión
Para el día a día, los enfoques 1 y 2 son los que usarás: rápidos, claros y fáciles de mantener. Pero el valor de un hilo así no es solo la solución que te llevas, sino ver cinco cabezas atacando el mismo problema desde ángulos opuestos. Ese contraste —de lo pragmático a lo ingenioso con números complejos— es exactamente lo que hace que valga la pena estar en la comunidad de Influexcel.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Error #CALC con MAP y AGRUPARPOR: solución con REDUCE+APILARV CasoNuevo reto de Excel resuelto por la comunidad: un usuario necesita aplicar AGRUPARPOR de forma iterativa sobre un rango de códigos de cuenta
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Cálculos iterativos con REDUCE y APILARV en Excel CasoLa comunidad aborda un caso sobre cómo trabajar con bucles iterativos en Excel usando funciones modernas. Un miembro necesita realizar cálcu
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Serie de Fibonacci con LAMBDA y REDUCE en una sola fórmula CasoSurge un reto interesante en la comunidad: generar la serie de Fibonacci con una sola fórmula de Excel, sin celdas auxiliares ni macros. Un
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Filtrar una tabla por una lista de valores: una LAMBDA propia y su inversa TutorialTe pasan una lista de 30 números de albarán y hay que sacar esas filas de una tabla de miles. Con el autofiltro es marcar casillas una a una
- Distribuir importes por meses según periodicidad: de fórmula ingeniosa a solución flexible con tabla maestra CasoJuan vuelve al grupo con un caso que ya tenía resuelto gracias a una fórmula de John, pero que necesitaba evolucionar. La fórmula original d
- Excel Agent Mode: Im-presionante. Así, sí vale la pena. TutorialEsta demostración práctica te guiará paso a paso para ver cómo trabaja la IA dentro de Excel.