SQL Dojo Beta
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_titletop_salarybest_paid
Buyer3100.00Nadia
Customer advisor2450.00Thomas
Order picker2050.00Océane
Provalo in Randori

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_titletop_salarybest_paid
Buyer3100.00Nadia
Customer advisor2450.00Amélie
Order picker2050.00Laura
Provalo in Randori