viernes, 11 de marzo de 2011

Obtener los tres mejores tiempos según categorías.

Explicaré hoy una forma de obtener los tres mejores tiempo en una carreara para cada grupo de edad; con ello trataré de contestar la cuestión planteada en un comentario por un lector:

...¿cómo podríamos identificar los 3 primeros, no sólo el máximo? ejemplo... tabla con tiempos de una carrera pero cada corredor es de una categoría, los tres primeros veteranos, cadetes... etc. etc. sin utilizar tablas dinámicas...


Trabajaremos en esta ocasión con una función ya conocida, la función K.ESIMO.MAYOR, pero en un formato matricial (Ctrl+Mayusc+Enter).
Pongamos un ejemplo de una tabla de resultados de una carrera, en el que se intercalan por orden de llegada los diferentes participantes, cada uno correspondiente a una categoría o grupo de edad (alevín, cadete y veterano):

Obtener los tres mejores tiempos.


Buscamos completar la siguiente tabla de posiciones para cada 'categoría':

Obtener los tres mejores tiempos.


La solución nos la dará combinar o anidar la función K.ESIMO.MAYOR con una función de conteo como es CONTAR.SI, todo ello en ejecutada en forma matricial (Ctrl+Mayusc+Enter):
{=K.ESIMO.MAYOR((Categoria=J$2)*(Tiempo);CONTAR.SI(Categoria;J$2)+1-$I3)}
para trabajar de manera más cómoda, previamente habremos asignado nombres a los diferentes campos de nuestra tabla de tiempos, siendo:
Categoria ='Hoja1'!$A$2:$A$16
Nombre ='Hoja1'!$B$2:$B$16
Tiempo ='Hoja1'!$C$2:$C$16

La explicación la podemos visualizar si en columnas auxiliares ejecutamos las diferentes órdenes:
En primer lugar, incluimos la fórmula:
=Categoria=J$2
que de manera individual, equivaldría para cada elemento del rango 'Categoria', chequear si es igual al valor de la celda J2, esto es, igual a la categoría concreta a evaluar (J2 = 'cadete'):

Obtener los tres mejores tiempos según categorías.


por supuesto, igual funcionaría para el resto de 'Categorías' a evaluar.

La segunda operación resulta de multiplicar el resultado de la fórmula anterior (VERDADERO =1 ó FALSO =0) por el tiempo realizado por el participante; que en su forma matricial vendría dado por:
(Categoria=J$2)*(Tiempo)
pero que en forma individual, sería:

Obtener los tres mejores tiempos.


Con esta operación obtenemos un rango sólo con los tiempos de la categoría a estudio; ahora únicamente tenemos que escoger los tres mejores tiempos; que conseguiremos aplicando con imaginación la función CONTAR.SI
Será con esta función CONTAR.SI con la que completaremos el segundo argumento, el de posición, de la función K.ESIMO.MAYOR.
=CONTAR.SI(Categoria;J$2)
obtendremos el número total de participantes de cada categoría, pero al pensarlo detenidamente también es el orden de posición último, contado de mayor a menor. No olvidemos que buscamos el menor tiempo, es decir, ordenado de mayor a menor, para un grupo de 5 participantes, el de mejor tiempo es el quinto mayor; el segundo será el cuarto en esta ordenación descendente y el mejor tiempo, para nuestro ejemplo el tercero.
Como queremos automatizar esas posiciones, aprovecharemos que en nuestra tabla de 'Posiciones' tenemos definidas las posiciones deseadas, y por tanto dejaremos nuestro argumento definido como:
CONTAR.SI(Categoria;J$2)+1-$I3

Acabamos obteniendo como resultado la función completa ya comentada:
{=K.ESIMO.MAYOR((Categoria=J$2)*(Tiempo);CONTAR.SI(Categoria;J$2)+1-$I3)

Obtener los tres mejores tiempos.
haz click en la imagen

1 comentario: