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.




