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

TOPN(
    ,
    ,
    ,
    []
)

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? No
¿Devuelve Top N? No (asigna puesto a todos)
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”.