sql >> Base de Datos >  >> RDS >> Mysql

mysql:¿unir los primeros y últimos registros por tipo de grupo?

Use la funcionalidad "funky" de mysql de un GROUP BY sin agregando las otras columnas, lo que simplemente devuelve el primero fila del grupo. Entonces, el problema es poner las filas en el orden correcto antes utilizando esta función, normalmente mediante una consulta con alias.

Este enfoque evita cualquier subconsulta correlacionada (consultas por fila) y solo necesita dos pasadas sobre la tabla (una para cada dirección de orden):

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 prueba:

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');

Salida:

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