Skip to main content

En análisis de datos es muy habitual necesitar algo como:

  • El último estado de un pedido
  • El nombre asociado a la fecha más reciente
  • El precio correspondiente al mayor timestamp
  • El valor vinculado al score máximo

En muchos motores SQL, resolver este patrón requiere funciones de ventana, subqueries o joins adicionales. En Snowflake, la función MAX_BY permite resolver estos casos de forma más directa y legible.

En este artículo veremos qué hace MAX_BY, cómo funciona y cuándo es recomendable utilizarla.

El patrón clásico: valor asociado a un máximo

Supongamos la siguiente tabla:

order_id

status

status_date

1

CREATED

2024-01-01

1

SHIPPED

2024-01-03

1

DELIVERED

2024-01-05

Queremos obtener el último estado de cada pedido.

Este es un patrón extremadamente común en SQL analítico.

 

Sintaxis de MAX_BY

La función tiene la siguiente forma:

MAX_BY(value_expression, order_expression)


  • value_expression: el valor que queremos devolver
  • order_expression: el criterio por el cual se determina el máximo

Devuelve el valor asociado al máximo del segundo argumento.

Ejemplo práctico

SELECT

    order_id,

    MAX_BY(status, status_date) AS latest_status

FROM orders_status

GROUP BY order_id;

Resultado:

order_id

latest_status

1

DELIVERED

Con una sola función, evitamos subqueries y funciones de ventana.

Comparación con funciones de ventana

Sin MAX_BY, una solución habitual sería:

SELECT

    order_id,

    status

FROM orders_status

QUALIFY ROW_NUMBER() OVER (

    PARTITION BY order_id

    ORDER BY status_date DESC

) = 1;

Ambas soluciones son válidas, pero MAX_BY:

  • Reduce complejidad visual
  • Elimina necesidad de QUALIFY
  • Hace más explícito el objetivo

Es especialmente útil en agregaciones.

MAX_BY en agregaciones múltiples

Podemos utilizarla varias veces dentro del mismo GROUP BY:

SELECT

    order_id,

    MAX_BY(status, status_date) AS latest_status,

    MAX_BY(updated_by, status_date) AS last_updated_by

FROM orders_status

GROUP BY order_id;

Esto permite obtener múltiples columnas asociadas al mismo máximo sin joins adicionales.

 

Diferencia frente a FIRST_VALUE y LAST_VALUE

FIRST_VALUE y LAST_VALUE:

  • Requieren ventana
  • No agregan resultados
  • Dependen del orden en el contexto de la ventana

MAX_BY:

  • Es una función agregada
  • Se integra naturalmente en GROUP BY
  • Es más directa cuando el objetivo es resumir por grupo

Consideraciones importantes

Al usar MAX_BY, conviene tener en cuenta:

  • Si existen empates en el valor máximo, Snowflake devolverá uno de los valores asociados.
  • Debe utilizarse en contexto de agregación.
  • No sustituye completamente las funciones de ventana.
  • El criterio debe ser comparable (fechas, números, etc.).

Es una herramienta específica para un patrón concreto.

Casos de uso reales

MAX_BY es especialmente útil en:

  • Historificación de estados
  • Slowly Changing Dimensions (tipo snapshot)
  • Última actividad por usuario
  • Última transacción por cliente
  • Recuperación del atributo más reciente

En pipelines analíticos reduce complejidad y mejora legibilidad.

MAX_BY y rendimiento

Dado que MAX_BY opera como función agregada, se integra eficientemente con el motor de Snowflake.

Gracias al diseño basado en micro-partitions y metadatos, Snowflake puede:

  • Optimizar agregaciones
  • Aplicar pruning
  • Ejecutar consultas paralelamente

No es solo una simplificación sintáctica; también es una expresión optimizada para el motor.

MIN_BY: el complemento natural

Snowflake también ofrece MIN_BY, que funciona de forma equivalente pero utilizando el valor mínimo como criterio.

Ejemplo:

SELECT

    order_id,

    MIN_BY(status, status_date) AS first_status

FROM orders_status

GROUP BY order_id;

Ambas funciones forman parte de un patrón analítico muy útil.

Errores comunes

Algunos errores habituales incluyen:

  • Usar MAX_BY cuando realmente se necesita lógica de ventana más compleja
  • No considerar empates en el valor máximo
  • Mezclarla con agregaciones inconsistentes
  • No entender qué columna actúa como criterio

Siempre debe usarse con claridad conceptual.

Conclusión

La función MAX_BY simplifica uno de los patrones más comunes en SQL analítico: obtener el valor asociado al máximo de otra columna. Permite escribir consultas más limpias, reducir complejidad y mejorar la legibilidad.

En entornos Snowflake, dominar funciones como MAX_BY y MIN_BY ayuda a construir pipelines más elegantes y mantenibles.