sql >> Database >  >> RDS >> Mysql

Top n-records ophalen voor elke groep gegroepeerde resultaten

Hier is een manier om dit te doen, met behulp van UNION ALL (Zie SQL Fiddle met demo ). Dit werkt met twee groepen, als u meer dan twee groepen heeft, moet u de group specificeren nummer en voeg zoekopdrachten toe voor elke 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
)

Er zijn verschillende manieren om dit te doen, zie dit artikel om de beste route voor uw situatie te bepalen:

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

Bewerken:

Dit kan ook voor u werken, het genereert een rijnummer voor elk record. Als u een voorbeeld uit de bovenstaande link gebruikt, worden alleen die records geretourneerd met een rijnummer kleiner dan of gelijk aan 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;

Zie Demo



  1. Vind alle zoekopdrachten die een bepaalde tabel gebruiken

  2. Twee partitionerende eigenaardigheden

  3. MariaDB JSON_VALUE() versus JSON_QUERY():wat is het verschil?

  4. SQL vervangt alle NULL's