Σε Oracle 9.2+ (όχι 8i+ όπως αναφέρθηκε αρχικά), SQL Server 2005+, PostgreSQL 8.4+, DB2, Firebird 3.0+, Teradata, Sybase, Vertica:
WITH summary AS (
SELECT p.id,
p.customer,
p.total,
ROW_NUMBER() OVER(PARTITION BY p.customer
ORDER BY p.total DESC) AS rk
FROM PURCHASES p)
SELECT s.*
FROM summary s
WHERE s.rk = 1
Υποστηρίζεται από οποιαδήποτε βάση δεδομένων:
Αλλά πρέπει να προσθέσετε λογική για να σπάσετε τις ισοπαλίες:
SELECT MIN(x.id), -- change to MAX if you want the highest
x.customer,
x.total
FROM PURCHASES x
JOIN (SELECT p.customer,
MAX(total) AS max_total
FROM PURCHASES p
GROUP BY p.customer) y ON y.customer = x.customer
AND y.max_total = x.total
GROUP BY x.customer, x.total
Στην PostgreSQL αυτό είναι συνήθως απλούστερο και γρηγορότερο (περισσότερη βελτιστοποίηση επιδόσεων παρακάτω):
Σε Oracle 9.2+ (όχι 8i+ όπως αναφέρθηκε αρχικά), SQL Server 2005+, PostgreSQL 8.4+, DB2, Firebird 3.0+, Teradata, Sybase, Vertica:
Υποστηρίζεται από οποιαδήποτε βάση δεδομένων:
Αλλά πρέπει να προσθέσετε λογική για να σπάσετε τις ισοπαλίες:
Η λύση δεν είναι πολύ αποτελεσματική, όπως επισήμανε ο Erwin, λόγω της παρουσίας των SubQs.