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

  • ORDENARPOR y ORDENAR: colocan el año más reciente arriba de cada grupo.
  • AGRUPARPOR: agrupa por artículo y admite una LAMBDA de 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