mysql - 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 的初学者,所以如果您还可以指出您正在使用的技术的名称,或者通俗地说解决方案的工作原理,那就太好了。太感谢了!
解决方案
推荐阅读
- nginx - 你能让 .htaccess 传递 PHP 参数吗
- java - 登录多线程环境
- laravel - Laravel 6 有哪些调试技术?
- python - 在 Python 中使用 Google Protobuf 序列化数据
- javascript - 补丁值方法中通过http请求获取对象数组的问题
- python - 用大括号代替括号python加入二维列表
- python - 获取 django 中的所有 html 模板
- listview - 使用 StreamBuilder 和从 Firebase Firestore 数据库查询时,ListView 不会更新/获取数据
- c# - 在 IIS 上发布后如何查看异常的详细信息
- flutter - Flutter 中的提供程序出现错误“在此 X 小部件上方找不到正确的提供程序”