首页 >数据库 >mysql教程 >如何从分组数据中有效提取最高的N记录?

如何从分组数据中有效提取最高的N记录?

Barbara Streisand
Barbara Streisand原创
2025-01-25 10:05:09275浏览

How to Efficiently Extract the Top N Records from Grouped Data?

高效提取分组数据中的顶级记录

假设有一个结构化数据集,包含人员、分组和年龄等列,本文探讨如何根据年龄在每个分组中获取前N个个体。

预期结果:

目标是在每个组中检索年龄最大的两个个人,如果年龄相同则按姓名字母顺序排列。

现有解决方案:

先前的方法(受@Bohemian提出的查询启发)为每个组检索单个顶级行:

<code class="language-sql">select * 
from (select * from mytable order by `Group`, Age desc, Person) x
group by `Group`</code>

使用UNION的增强解决方案:

扩展此功能的一种方法是使用UNION ALL运算符,从而能够为每个组检索指定数量的记录:

<code class="language-sql">(
  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
)</code>

使用行号的替代方法:

另一种方法是为每条记录生成一个行号,然后根据此行号进行筛选:

<code class="language-sql">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;</code>

结论:

根据具体的要求和数据特征,UNION和行号技术都提供了有效的解决方案,用于在分组结果中检索顶级记录。

以上是如何从分组数据中有效提取最高的N记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn