mysql laravel greatest-n-per-group

mysql - Laravel Eloquent group por registro más reciente



greatest-n-per-group (2)

Para obtener el último registro por cliente entre cada ciudad basado en created_at , puede usar una created_at

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

Demo

Otro enfoque con auto 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

Demo

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 tiene campos created_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 la consulta SQL aquí y encontraré una manera de "traducirla" a la sintaxis de Laravel.


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

Consulta de Laravel para obtener los últimos datos en la base de id