sql >> Databasteknik >  >> RDS >> Mysql

Få topp n poster för varje grupp av grupperade resultat

Här är ett sätt att göra detta, med UNION ALL (Se SQL-fiol med demo ). Detta fungerar med två grupper, om du har fler än två grupper måste du ange group nummer och lägg till frågor för varje 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
)

Det finns en mängd olika sätt att göra detta, se den här artikeln för att bestämma den bästa vägen för din situation:

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

Redigera:

Detta kan fungera för dig också, det genererar ett radnummer för varje post. Om du använder ett exempel från länken ovan returneras endast de poster med ett radnummer som är mindre än eller lika med 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;

Se Demo



  1. Hur man tar bort ett lösenord från en databas i Access 2016

  2. Skillnad mellan tabellfunktion och rörledningsfunktion?

  3. Hur man byter namn på databas i SQL Server - SQL Server / TSQL självstudie del 26

  4. Hur man skapar en användare med PSQL