每组MySQL有效的最大N个值

时间:2020-11-11 05:09:57

标签: mysql

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

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

+----+------+------+           
| 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组中有三个匹配项;对于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;

但是,如this post所述,此查询在O(n ^ 2)(n =行数)上运行。我想知道有人会教我不同于相关子查询的其他技术吗?我是MySQL的初学者,因此,如果您还可以指出所使用技术的名称,或者以通俗易懂的方式讲解解决方案的工作方式,那将是很棒的。非常感谢!

0 个答案:

没有答案