Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nhận n bản ghi hàng đầu cho mỗi nhóm kết quả được nhóm lại

Đây là một cách để thực hiện việc này, sử dụng UNION ALL (Xem SQL Fiddle với Demo ). Điều này hoạt động với hai nhóm, nếu bạn có nhiều hơn hai nhóm, thì bạn sẽ cần chỉ định group đánh số và thêm các truy vấn cho mỗi 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
)

Có nhiều cách khác nhau để thực hiện việc này, hãy xem bài viết này để xác định con đường tốt nhất cho tình huống của bạn:

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

Chỉnh sửa:

Điều này cũng có thể hiệu quả với bạn, nó tạo ra một số hàng cho mỗi bản ghi. Sử dụng một ví dụ từ liên kết ở trên, điều này sẽ chỉ trả về những bản ghi có số hàng nhỏ hơn hoặc bằng 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;

Xem Demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Neo4j - Bỏ Ràng buộc bằng Cypher

  2. Giới thiệu về Chỉ mục SQL

  3. Cân bằng tải PostgreSQL &Cải tiến ProxySQL - ClusterControl 1.5

  4. Truy xuất id được chèn lần cuối bằng Mysql

  5. Xuất MySQL vào outfile:Các ký tự thoát CSV