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

Ottieni i primi n record per ogni gruppo di risultati raggruppati

Ecco un modo per farlo, usando UNION ALL (Vedi SQL Fiddle con demo ). Funziona con due gruppi, se hai più di due gruppi, dovresti specificare il group numero e aggiungi query per ogni 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
)

Esistono diversi modi per farlo, consulta questo articolo per determinare il percorso migliore per la tua situazione:

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

Modifica:

Questo potrebbe funzionare anche per te, genera un numero di riga per ogni record. Utilizzando un esempio dal collegamento sopra, verranno restituiti solo i record con un numero di riga inferiore o uguale 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;

Vedi Demo