Parola chiave
MAX_BY e MIN_BY
Il valore di una colonna sulla riga in cui un'altra colonna è massima (o minima), in un semplice
GROUP BY.MAX(salary) dà l'importo, non la persona; MAX_BY(first_name, salary) dà il nome. Due MIN nello stesso
GROUP BY possono venire da righe diverse, quindi "la pagina del primo evento" è MIN_BY(page, occurred_at). In caso
di pari merito, MAX_BY tiene una qualsiasi delle righe pari: quando i pari merito contano, ordina con
ROW_NUMBER() OVER (… ORDER BY salary DESC, employee_id) e tieni la riga 1. Snowflake, BigQuery, Databricks e Trino la
scrivono MAX_BY / MIN_BY, DuckDB anche arg_max / arg_min; Postgres non ha né l'una né l'altra: usa ROW_NUMBER.
La trappola
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 correzione
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 |