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 |
+------+-----------+----------+