高效提取分组数据中的顶级记录
假设有一个结构化数据集,包含人员、分组和年龄等列,本文探讨如何根据年龄在每个分组中获取前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中文网其他相关文章!