首页 > 数据库 > mysql教程 > 如何从 MySQL 表中检索按特定列分组的前 N ​​个最大值?

如何从 MySQL 表中检索按特定列分组的前 N ​​个最大值?

Linda Hamilton
发布: 2024-11-10 05:33:02
原创
246 人浏览过

How do you retrieve the top N maximum values from a MySQL table, grouped by a specific column?

从 MySQL 表中检索前 N 个最大值

数据分析中的常见任务涉及选择特定列的前 N ​​个最大值从一张桌子上。考虑下表:

column1 column2
1 foo
2 foo
3 foo
4 foo
5 bar
6 bar
7 bar
8 bar

问题陈述:

对于给定的 n 值,检索第 1 列的前 n 个最大值,按第 2 列分组。在上面的示例中,对于 n=2,所需的输出将为:

column1
3
4
7
8

解决方案:

虽然一个简单的方法可能涉及按列对行进行分组2并为每个组选择最大值,这只会返回每个组的绝对最大值。要检索前 n 个值,需要更高级的方法。

基于 UNION 的方法:

一种方法涉及使用 UNION 子句来组合多个查询,每个查询选择不同组的最大值。对于 n=2,以下查询就足够了:

SELECT max(column1) m
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) WHERE column2 = t.column2)
登录后复制

基于排名的方法:

对于更灵活的 n 值,可以使用基于排名的方法受雇。这涉及到根据column1 的值为每行分配一个排名,然后选择排名前n 的行。以下查询实现了这种方法:

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid
登录后复制

将 'grouper' 替换为分组依据列的名称,将 'val' 替换为保存值的列。

LIMIT 子句定义每个组的第 n 个排名值。然后选择值大于第 n 个排名值的行。

结论:

两种方法都提供了从表中选择前 n 个最大值的有效方法,每种方法有其自身的优势和局限性。基于联合的方法简单而强大,而基于排名的方法在指定要检索的最大值的数量方面提供了灵活性。

以上是如何从 MySQL 表中检索按特定列分组的前 N ​​个最大值?的详细内容。更多信息请关注PHP中文网其他相关文章!

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