Επιλέξτε την πρώτη γραμμή σε κάθε ομάδα GROUP BY;

Στην PostgreSQL αυτό είναι συνήθως απλούστερο και γρηγορότερο (περισσότερη βελτιστοποίηση επιδόσεων παρακάτω):

SELECT DISTINCT ON (customer)
       id, customer, total
FROM αγορές
ORDER BY customer, total DESC, id;
Σχόλια (7)
Λύση

Σε 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
Σχόλια (7)

Η λύση δεν είναι πολύ αποτελεσματική, όπως επισήμανε ο Erwin, λόγω της παρουσίας των SubQs.

select * from purchases p1 where total in
(select max(total) from purchases where p1.customer=customer) order by total desc;
Σχόλια (4)