mysql - 为列 A 的每个值选择列 B 的 N 个最频繁值
问题描述
使用 MySQL 表,如:
id | colA | colB
...| 1 | 13
...| 1 | 13
...| 1 | 12
...| 1 | 12
...| 1 | 11
...| 2 | 78
...| 2 | 78
...| 2 | 78
...| 2 | 13
...| 2 | 13
...| 2 | 9
对于中的每个值,colA
我想在 中找到 N 个最常见的值colB
。
N=2 的示例结果:
colA | colB
1 | 13
1 | 12
2 | 78
2 | 13
我可以使用以下方法获得所有独特colA
的colB
频率组合:
SELECT colA, colB, COUNT(*) AS freq FROM t GROUP BY colA, colB ORDER BY freq DESC;
示例结果:
colA | colB | freq
1 | 13 | 2
1 | 12 | 2
1 | 11 | 1
2 | 78 | 3
2 | 13 | 2
2 | 9 | 1
但是我很难LIMIT
为每个值colA
而不是整个表应用一个。
这基本上就像如何在每个 id 组的列中选择最频繁的值?,仅适用于 MySQL 而不是 PostgreSQL。
我目前正在使用 MariaDB 10.1。
解决方案
Use window functions, if you can:
SELECT colA, colB, freq
FROM (SELECT colA, colB, COUNT(*) AS freq,
DENSE_RANK() OVER (PARTITION BY colA ORDER BY COUNT(*) DESC) as seqnum
FROM t
GROUP BY colA, colB
) ab
WHERE seqnum <= 2;
Note that you might want DENSE_RANK()
, RANK()
or ROW_NUMBER()
depending on how you want to treat ties. If there are 5 colB
values with the two highest ranks, then DENSE_RANK()
will return all five.
If you want exactly two values, then use ROW_NUMBER()
.
推荐阅读
- python - 如何从 python-opencv 图像处理项目中的给定数据集中查找文件/数据?
- node.js - 如何循环MongoDB收集和处理文档?
- python - 从 xml 文档中获取子项
- mysql - 选择与 MySQL 中按 Id 增量分组的条件匹配的行数
- ampl - AMPL 中的临时变量
- c++ - 我无法编译文件系统库
- python - 使用适用于 x86 (win32) 的 Armadillo 和 MKL 库构建
- mysql - 当我对新数据库运行 install.sql 时出现 MySQL 问题
- visual-c++ - Visual Studio 在正确的目录中查找,但仍然说找不到文件
- c# - 使用 NewtonSoft.Json 将 API 字符串转换为 JSON 对象