Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql - juntar os primeiros e últimos registros por tipo de grupo?


Use a funcionalidade "funky" do mysql de um GROUP BY sem agregando as outras colunas, que simplesmente retorna o primeiro fileira do grupo. O problema passa a ser colocar as linhas na ordem correta antes usando essa funcionalidade, normalmente usando uma consulta com alias.

Essa abordagem evita subconsultas correlacionadas (consultas por linha) e precisa de apenas duas passagens pela tabela (uma para cada direção de ordenação):
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;

Código de teste:
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');

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