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





greatest-n-per-group