Palabra clave
MAX_BY y MIN_BY
El valor de una columna en la fila donde otra columna es máxima (o mínima), en un simple
GROUP BY.MAX(salary) da el importe, no la persona; MAX_BY(first_name, salary) da el nombre. Dos MIN en un mismo
GROUP BY pueden venir de filas distintas, así que «la página del primer evento» es MIN_BY(page, occurred_at). En caso
de empate, MAX_BY conserva cualquiera de las filas empatadas: cuando los empates importan, ordene con
ROW_NUMBER() OVER (… ORDER BY salary DESC, employee_id) y quédese con la fila 1. Snowflake, BigQuery, Databricks y
Trino la escriben MAX_BY / MIN_BY, DuckDB también arg_max / arg_min; Postgres no tiene ninguna: use ROW_NUMBER.
La trampa
SELECT job_title, MAX(salary) AS top_salary, MAX(first_name) AS best_paid
FROM employees
WHERE job_title IN ('Order picker', 'Customer advisor', 'Buyer')
GROUP BY job_title
ORDER BY job_title;
| job_title | top_salary | best_paid |
|---|---|---|
| Buyer | 3100.00 | Nadia |
| Customer advisor | 2450.00 | Thomas |
| Order picker | 2050.00 | Océane |
La corrección
SELECT job_title, MAX(salary) AS top_salary,
MAX_BY(first_name, salary) AS best_paid
FROM employees
WHERE job_title IN ('Order picker', 'Customer advisor', 'Buyer')
GROUP BY job_title
ORDER BY job_title;
| job_title | top_salary | best_paid |
|---|---|---|
| Buyer | 3100.00 | Nadia |
| Customer advisor | 2450.00 | Amélie |
| Order picker | 2050.00 | Laura |