Schlüsselwort
MAX_BY und MIN_BY
Der Wert einer Spalte in der Zeile, in der eine andere Spalte am größten (oder kleinsten) ist, in einem einfachen
GROUP BY.MAX(salary) liefert den Betrag, nicht die Person; MAX_BY(first_name, salary) liefert den Namen. Zwei MIN in
einem GROUP BY können aus verschiedenen Zeilen stammen, also ist „die Seite des ersten Ereignisses“
MIN_BY(page, occurred_at). Bei Gleichstand behält MAX_BY irgendeine der gleichen Zeilen: Wenn Gleichstände zählen,
ordnen Sie mit ROW_NUMBER() OVER (… ORDER BY salary DESC, employee_id) und behalten Zeile 1. Snowflake, BigQuery,
Databricks und Trino schreiben es MAX_BY / MIN_BY, DuckDB auch arg_max / arg_min; Postgres hat keins von beiden:
Nehmen Sie dort ROW_NUMBER.
Die Falle
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 |
Die Korrektur
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 |