RANKX VS TOPN EN POWER BI: GUÍA DEFINITIVA PARA ELEGIR LA FUNCIÓN CORRECTA
Aunque ambas funciones sirven para trabajar con “los mejores” o “los peores”, no son intercambiables. Usar una u otra de forma incorrecta genera resultados erróneos, problemas de rendimiento o filas en blanco.
¿Qué es RANKX?
"RANKX" es una función escalar. Devuelve el ranking para cada fila en el contexto actual.
Sintaxis básica
RANKX(
tabla,
expresión,
[valor],
[orden],
[empates]
)
Características principales
- Asigna un puesto (1, 2, 3…) a cada elemento.
- Puede manejar empates de tres formas: "SKIP", "DENSE" o "STANDARD".
- Es dinámica: se recalcula según los filtros de la parte visual, como segmentadores etc.
- Se usa casi siempre como medida.
Ejemplo típic
Ranking Ventas Producto =
RANKX(
ALLSELECTED(productos[nombre_producto]),
[Total Ventas],
,
DESC,
Dense
)
¿Qué es TOPN?
"TOPN" es una función de tabla. Devuelve una tabla con las "N" primeras filas según una expresión.
Sintaxis básica
Características principales
- Devuelve un subconjunto de filas, los "Top N".
- No asigna ranking, solo selecciona.
- Se usa normalmente dentro de "CALCULATE", "SUMX", "FILTER" o para crear tablas calculadas.
- Es muy eficiente cuando solo necesitas un número fijo de elementos.
Ejemplo típico
Top 5 Productos =
CALCULATE(
[Total Ventas],
TOPN(5, ALL(productos[nombre_producto]), [Total Ventas], DESC)
)
Comparación directa
| Aspecto |
RANKX |
TOPN |
| Tipo de función |
Escalar (devuelve número) |
Tabla (devuelve tabla) |
| ¿Asigna ranking? |
Sí |
No |
| ¿Devuelve Top N? |
No (asigna puesto a todos) |
Sí |
| Manejo de empates |
Excelente (Skip, Dense, Standard) |
Limitado |
| Uso más común |
Medidas de ranking dinámico |
Filtrar Top N dentro de CALCULATE |
| Rendimiento |
Puede ser costoso con muchas filas |
Generalmente más rápido |
| Filas en blanco |
Frecuente si no se controla |
Menos frecuente |
| Ideal para |
Tablas con ranking visible |
KPIs de “Top 5”, “Top 10” |
¿Cuándo usar cada una?
Usar "RANKX" cuando:
- Se necesitas mostra el puesto de cada producto, cliente o categoría.
- Se quiere que el ranking sea dinámico con los segmentadores.
- Se tienen que manejar empates de forma profesional.
- Se va a poner el ranking en una tabla o matriz junto al nombre del producto.
Usa "TOPN" cuando:
- Cuando solo interesan los N mejores, Top 5, Top 10, Top 20….
- Si se quiere calcular un total solo de los "Top N".
- Se está creando una medida de “% del Top 5 sobre el total”.
- Se necesita mejor rendimiento y no te importa el puesto exacto.
Combinar las dos
Muchas veces la mejor solución es combinarlas:
Ranking Solo Top 10 =
VAR Ranking =
RANKX(
ALLSELECTED(productos[nombre_producto]),
[Total Ventas],
,
DESC,
Dense
)
RETURN
IF(Ranking <= 10, Ranking)
O la versión más limpia y recomendada actualmente:
Top 10 Ranking =
IF(
[Total Ventas] > 0,
RANKX(
FILTER(ALLSELECTED(productos[nombre_producto]), [Total Ventas] > 0),
[Total Ventas],
,
DESC,
Dense
)
)
Errores comunes que generan filas en blanco
- Usar "ALL()" en lugar de "ALLSELECTED()" → incluye productos sin ventas.
- No filtrar "[Total Ventas] > 0" dentro del "RANKX".
- Usar "TOPN" pensando que asigna ranking (no lo hace).
- Olvidar que "RANKX" evalúa la expresión en un contexto de fila diferente.
"RANKX" = “Dime en qué puesto está cada uno”.
"TOPN" = “Dame solo los N mejores”.