首页 > 解决方案 > MySQL 每组有效的最大 N 个值

问题描述

给定一张桌子CREATE TABLE t (id INT PRIMARY KEY, col1 INT, col2 VARCHAR(20));。如何有效地找到col1分组中的最大 N 个值col2

例如,对于 N=2,我需要编写一个查询来从 table 获取 RHS 表t

+----+------+------+           
| id | col1 | col2 |         +----+------+------+
+------------------+         | id | col1 | col2 |
|  1 |    1 |  A   |         +----+------+------+
|  2 |    1 |  A   |         |  1 |    1 | A    |
|  3 |    2 |  A   |   -->   |  2 |    1 | A    |
|  4 |   10 |  B   |         |  3 |    2 | A    |
|  5 |   20 |  B   |         |  5 |   20 | B    |
|  6 |   30 |  B   |         |  6 |   30 | B    |
|  7 |  100 |  C   |         |  7 |  100 | C    |
+----+------+------+         +----+------+------+

      Table: t                Table: query result

对于 A 组,它需要返回所有三行,因为最大 2 个数字是 (1,2),并且 A 组中有 3 个匹配项;对于 B 组,最多 2 个数字是 (20, 30) 并且有两个匹配项;C 组只有一个最大值,即 100,因此只返回该行就足够了。

我通过使用相关子查询得到了这个结果。代码如下:

select id, col1, col2 
from t as t1
where (
       select count(distinct t2.col1) from t as t2
       where t1.col2 = t2.col2 and t1.col1 < t2.col1
) < 2;

但是,正如本文所述,此查询在 O(n^2)(n=# of rows)上运行。我想知道有人可以教我一种不同的技术,而不是可以运行得更快的相关子查询吗?我是 MySQL 的初学者,所以如果您还可以指出您正在使用的技术的名称,或者通俗地说解决方案的工作原理,那就太好了。太感谢了!

标签: mysql

解决方案


推荐阅读