Выберите первую строку в каждой группе GROUP BY?

Как следует из названия, я бы хотел выбрать первую строку каждого набора строк, сгруппированных с помощью GROUP BY .

В частности, если у меня есть таблица purchases которая выглядит так:

 SELECT * FROM purchases; 
 id |  клиент |  Всего
 --- + ---------- + ------
  1 |  Джо |  5
  2 |  Салли |  3
  3 |  Джо |  2
  4 |  Салли |  1

Я хотел бы запросить id самой большой покупки ( total ), сделанной каждым customer . Что-то вроде этого:

 SELECT FIRST(id), customer, FIRST(total) FROM purchases GROUP BY customer ORDER BY total DESC; 
 FIRST (id) |  клиент |  ПЕРВЫЙ (всего)
 ---------- + ---------- + -------------
         1 |  Джо |  5
         2 |  Салли |  3

В 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