Laravel Eloquent group por registro más reciente

Estoy tratando de obtener el registro más reciente para un solo cliente en una mesa. Ejemplo:

ID Customer City Amount 1 Cust001 City1 2 2 Cust001 City2 3 3 Cust001 City1 1 4 Cust001 City2 1 5 Cust001 City2 3 6 Cust001 City3 1 7 Cust001 City3 1 8 Cust002 City1 2 9 Cust002 City1 1 10 Cust002 City2 3 11 Cust002 City1 2 12 Cust002 City2 1 13 Cust002 City3 2 14 Cust002 City3 3 15 Cust003 City1 1 16 Cust003 City2 3 17 Cust003 City3 2 

Tenga en cuenta que la tabla también ha creado los campos_at y updated_at. Omití esos campos por simplicidad.

Al final, quiero que mi consulta regrese para Cust001:

 ID Customer City Amount 3 Cust001 City1 1 5 Cust001 City2 3 7 Cust001 City3 1 

Y para Cust002:

 ID Customer City Amount 11 Cust002 City1 2 12 Cust002 City2 1 14 Cust002 City3 3 

He intentado:

 Table::where('Customer', 'Cust001') ->latest() ->groupBy('City') ->get() 

y también

 Table::select(DB::raw('t.*'))->from(DB::raw('(select * from table where Customer = \'Cust001\' order by created_at DESC) t')) ->groupBy('t.City')->get(); 

Pero sigue devolviendo el registro más antiguo de cada grupo (y quiero el más reciente).

¿Cómo puedo conseguir esto? Si es más fácil para ustedes, pueden escribir aquí la Consulta SQL y encontraré la forma de “traducirla” a la syntax de Laravel.

Para obtener el registro más reciente por cliente para cada ciudad basado en created_at , puede usar una auto-unión

 DB::table('yourTable as t') ->select('t.*') ->leftJoin('yourTable as t1', function ($join) { $join->on('t.Customer','=','t1.Customer') ->where('t.City', '=', 't1.City') ->whereRaw(DB::raw('t.created_at < t1.created_at')); }) ->whereNull('t1.id') ->get(); 

En SQL simple sería algo así como

 select t.* from yourTable t left join yourTable t1 on t.Customer = t1.Customer and t.City = t1.City and t.created_at < t1.created_at where t1.id is null 

Manifestación

Otro enfoque con la unión interna sería

 select t.* from yourTable t join ( select Customer,City,max(ID) ID from yourTable group by Customer,City ) t1 on t.Customer = t1.Customer and t.City = t1.City and t.ID = t1.ID 

Manifestación

 DB::table('table')->orderBy('id', 'desc')->get(); 

Consulta de Laravel para obtener los últimos datos en la base de la identificación