Принятое решение OMG Ponies "Поддерживается любой базой данных" имеет хорошую скорость из моего теста.
Здесь я предоставляю тот же подход, но более полное и чистое решение для любой базы данных. Рассматриваются связи (предположим, что требуется получить только одну строку для каждого клиента, даже несколько записей для максимальной общей суммы для каждого клиента), и другие поля покупки (например, purchase_payment_id) будут выбраны для реально соответствующих строк в таблице покупок.
Поддерживается любой базой данных:
select * from purchase
join (
select min(id) as id from purchase
join (
select customer, max(total) as total from purchase
group by customer
) t1 using (customer, total)
group by customer
) t2 using (id)
order by customer
Этот запрос выполняется достаточно быстро, особенно если в таблице покупок есть составной индекс, такой как (клиент, итог).
Примечание:
t1, t2 - псевдоним подзапроса, который можно удалить в зависимости от базы данных.
Предостережение : предложение using (...)
в настоящее время не поддерживается в MS-SQL и Oracle db по состоянию на январь 2017 года. Вы должны расширить его, например, до. on t2.id = purchase.id
и т. Д. Синтаксис USING работает в SQLite, MySQL и PostgreSQL.