首页 > 解决方案 > 获取 MySQL 中每个组的前 N ​​行

问题描述

给定一个 MySQL 表的形式

Name   | Type
-------+-----
Bill   | A
Hill   | B
Jill   | C
Hans   | A
George | C
Sophie | B
Hannah | B
Nancy  | C
Phil   | A
...    | ...

我想生成一个 MySQL 查询,它为我提供N按类型分组的顶部行。我所说的“顶部”是指给定的排序。在此示例中,它可以是通过按字母顺序(或按日期,如果所有类型参数都是日期)排序类型参数给出的顺序。例如,如果N = 2,则结果表可能是:

Name   | Type
-------+-----
Bill   | A
Hill   | B
Jill   | C
Hans   | A
George | C
Sophie | B
...    | ...

也就是说,条目很可能在结果表中被分组为它们各自的类型,但它们的重要性并不严格。我运行 MySQL 8.x。

标签: mysqlsqldatabase

解决方案


如果您想要n每组的行,请使用row_number(). 如果您希望它们交错,请使用order by

select t.*
from (select t.*,
             row_number() over (partition by type order by name) as seqnum
      from t
     ) t
where seqnum <= 2
order by seqnum, type;

这假设“top”按字母顺序排列name。如果您有其他定义,请将其order by用于 for row_number()


推荐阅读