首页 > 数据库 > mysql教程 > 如何检索SQL中每个组的顶部N记录?

如何检索SQL中每个组的顶部N记录?

Susan Sarandon
发布: 2025-01-25 09:52:09
原创
145 人浏览过

How to Retrieve the Top N Records for Each Group in SQL?

在SQL

中检索每个组的顶部N记录

本指南演示了如何在SQL表中的每个组中有效检索每个组的顶部N记录,按年龄(下降)订购,然后按人的名字按字母来处理以处理领带的字母。

方案:

想象一张包含有关人员的信息,他们的群体隶属关系及其年龄的表:

的目标是检索每个组的前2个(n = 2)记录,优先考虑老年人并使用字母顺序解决领带。所需的输出为:
Person Group Age
Bob 1 32
Jill 1 34
Shawn 1 42
Jake 2 29
Paul 2 36
Laura 2 39

>解决方案:

提出了两种常见方法:

> UNION ALL窗口函数。 ROW_NUMBER()>

方法1:使用Union ALL(大型数据集效率较低)

此方法很简单,但对于拥有许多组和大量记录的表和大量记录的表可能会降低。 它涉及为每个组创建一个单独的查询,并使用组合结果。 此示例将检索每个组的前2个记录(n = 2):>

这种方法需要为每个其他组修改。 对于大量组而言,这是不可扩展的。UNION ALL>

<code class="language-sql">(
  SELECT *
  FROM mytable
  WHERE `group` = 1
  ORDER BY age DESC, person
  LIMIT 2
)
UNION ALL
(
  SELECT *
  FROM mytable
  WHERE `group` = 2
  ORDER BY age DESC, person
  LIMIT 2
)</code>
登录后复制
方法2:使用row_number()(更有效)

>

>窗口函数提供了更有效,更可扩展的解决方案。它根据指定的排序为每个组中的每一行分配一个唯一的等级。> >此查询首先将等级(

)分配给每个组中的每一行,按年龄(下降)订购,然后按人的名字订购。然后,外部查询过滤结果仅包括等级小于或等于2(n = 2)的那些行。 这种方法效率更高,易于适应n的不同值和可变数量的组。

ROW_NUMBER()进一步读取:

<code class="language-sql">SELECT person, `group`, age
FROM (
   SELECT person, `group`, age,
      ROW_NUMBER() OVER (PARTITION BY `group` ORDER BY age DESC, person) as rn
   FROM mytable
) as ranked_data
WHERE rn <= 2;</code>
登录后复制
>有关选择每组最高n纪录的技术的全面探索,请参阅此资源:

https://www.php.cn/link/131632CB7EEB986974E1BE59AF6AF6AF67E8FErn

以上是如何检索SQL中每个组的顶部N记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板