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

Obtenga los mejores n registros para cada grupo de resultados agrupados

Aquí hay una forma de hacer esto, usando UNION ALL (Consulte SQL Fiddle con demostración ). Esto funciona con dos grupos, si tiene más de dos grupos, deberá especificar el group número y agregar consultas para cada group :

(
  select *
  from mytable 
  where `group` = 1
  order by age desc
  LIMIT 2
)
UNION ALL
(
  select *
  from mytable 
  where `group` = 2
  order by age desc
  LIMIT 2
)

Hay una variedad de formas de hacer esto, consulte este artículo para determinar la mejor ruta para su situación:

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

Editar:

Esto también podría funcionar para usted, genera un número de fila para cada registro. Usando un ejemplo del enlace anterior, esto devolverá solo aquellos registros con un número de fila menor o igual a 2:

select person, `group`, age
from 
(
   select person, `group`, age,
      (@num:=if(@group = `group`, @num +1, if(@group := `group`, 1, 1))) row_number 
  from test t
  CROSS JOIN (select @num:=0, @group:=null) c
  order by `Group`, Age desc, person
) as x 
where x.row_number <= 2;

Ver Demostración