给出一个表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的初学者,因此,如果您还可以指出所使用技术的名称,或者以通俗易懂的方式讲解解决方案的工作方式,那将是很棒的。非常感谢!