当前位置: 首页 > 面试题库 >

获取每组分组结果的前n条记录

吴峰
2023-03-14
问题内容

以下是最简单的示例,尽管任何解决方案都应能够扩展到需要n个顶级结果的地方:

给定下面的表格,其中包含“人员”,“组”和“年龄”列,您将如何 获得每个组中 年龄 最大的2个人?
(组内的关系不应产生更多结果,而应按字母顺序给出前两个)

+ -------- + ------- + ----- +
| 人 集团| 年龄|
+ -------- + ------- + ----- +
| 鲍勃| 1 | 32 |
| 吉尔| 1 | 34 |
| 肖恩| 1 | 42 |
| 杰克 2 | 29 |
| 保罗| 2 | 36 |
| 劳拉| 2 | 39 |
+ -------- + ------- + ----- +

所需的结果集:

+ -------- + ------- + ----- +
| 肖恩| 1 | 42 |
| 吉尔| 1 | 34 |
| 劳拉| 2 | 39 |
| 保罗| 2 | 36 |
+ -------- + ------- + ----- +

注意: 这个问题建立在先前的问题上-
获取每组分组的SQL结果的最大值的记录
-用于从每组中获取一个顶行,并且从@Bohemian那里收到了一个MySQL特有的答案:

select * 
from (select * from mytable order by `Group`, Age desc, Person) x
group by `Group`

我希望能够以此为基础,尽管我不知道如何做到。


问题答案:

这是使用的一种方法UNION ALL(请参阅带有演示的SQL
Fiddle
)。这适用于两个组,如果您有两个以上的组,则需要指定group数字并为每个组添加查询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
)

有多种方法可以执行此操作,请参阅本文以确定适合您情况的最佳路线:

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

编辑:

这也可能对您有用,它会为每个记录生成一个行号。使用上面链接中的示例,这将仅返回行号小于或等于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;

观看演示



 类似资料:
  • 如何获得包含每个分组集的最大值的行? 关于这个问题,我见过一些过于复杂的变体,但没有一个有好的答案。我试着举一个最简单的例子: 给出一个类似下面的表,包含person,group,和age列,如何得到每个组中最年长的人?(一组内的平局应给出第一个按字母顺序排列的结果) 所需的结果集:

  • 问题内容: 如何获得包含每个分组集最大值的行? 我在这个问题上看到了一些过于复杂的变体,但都没有一个很好的答案。我尝试将最简单的示例放在一起: 给定下面的表格,其中包含“人员”,“组”和“年龄”列,您将如何获得每个组中年龄最大的人?(组内的平局应该给出第一个字母顺序的结果) 所需的结果集: 问题答案: 在mysql中有一种超简单的方法: 这工作,因为在MySQL中你被允许 不 聚集非组逐列,在这种

  • 问题内容: 我试图从看起来像这样的数据库表结果中选择前2条记录 我试过这个查询 但是有些主题,例如失踪的地方,我什至尝试了以下链接的建议 如何选择每个组的前N行? 但是我为每个受检者得到两个以上 我究竟做错了什么? 问题答案: 您可以使用相关的子查询: 该查询通过串联三列来构造单列主键。如果您有真正的主键(如),则可以用代替。 SQL Fiddle中的示例。

  • 问题内容: 我在数据库上有一些性能测试结果,我要做的是将每1000条记录 分组 (以前按日期升序排列),然后将结果与 AVG 进行汇总。 我实际上正在寻找标准的SQL解决方案,但是任何T-SQL特定的结果也值得赞赏。 查询如下所示: 问题答案: 这样的事情应该会让您入门。如果您可以提供实际的架构,我可以进行适当的更新。

  • 本文向大家介绍MySQL获取所有分类的前N条记录,包括了MySQL获取所有分类的前N条记录的使用技巧和注意事项,需要的朋友参考一下 比如有文章表 Article(Id,Category,InsertDate),现在要用SQL找出每种类型中时间最新的前N个数据组成的集合,一段不错的代码,留存备用 @N 就是你要取多少条 下面是我用到了一个产品分类表中,superId是大分类,prcid是产品分类。能

  • 问题内容: 我有一张桌子,我想在该表格的基础上从每个组中获取前N个项目。如果我设置了那将从每个组中选择第一行,或者如果我设置了那那将从每个组中选择前5行。请帮我。 问题答案: 有多种方法可以做到这一点。这是一个使用相关子查询的查询: