Mysql
 sql >> Database >  >> RDS >> Mysql

mysql:unisci il primo e l'ultimo record per tipo di gruppo?

Usa la funzionalità "funky" di mysql di un GROUP BY senza aggregando le altre colonne, che restituisce semplicemente il first fila del gruppo. Il problema diventa quindi mettere le righe nell'ordine corretto prima utilizzando questa funzionalità, in genere utilizzando una query con alias.

Questo approccio evita le sottoquery correlate (query per riga) e richiede solo due passaggi sulla tabella (uno per ciascuna direzione di ordinamento):

select x2.type, x2.dat as first_dat, y2.dat as last_dat
from (select *
  from (select type, dat
    from so8735514
    order by 1, 2) x1
  group by 1) x2
join (select *
  from (select type, dat
    from so8735514
    order by 1, 2 desc) y1
  group by 1) y2 on y2.type = x2.type;

Codice di prova:

create table so8735514 (idx int, type text, dat text);
insert into so8735514 values
(0, 'a', 'foo1'),
(1, 'b', 'foo2'),
(2, 'c', 'foo3'),
(3, 'a', 'foo4'),
(4, 'b', 'foo5'),
(5, 'c', 'foo6'),
(6, 'a', 'foo7'),
(7, 'b', 'foo8'),
(8, 'c', 'foo9');

Uscita:

+------+-----------+----------+
| type | first_dat | last_dat |
+------+-----------+----------+
| a    | foo1      | foo7     |
| b    | foo2      | foo8     |
| c    | foo3      | foo9     |
+------+-----------+----------+