我是否有可能找到使用sql表中出现的最频繁的数字对。即: 我填写了数字的列数很少:
num1, num2, num3, num4, num5, num6
2 3 4 5 6 7
当然行数越大但你有了一个想法.. 目标是显示例如出现在行中的10对数字。
请告诉我是否可能,或者我应该采取“蛮力”的解决方案。
此致
答案 0 :(得分:1)
试试这个。
SELECT TOP 10 num1, num2, num3, num4, num5, num6
FROM MyTable
GROUP BY num1, num2, num3, num4, num5, num6
ORDER BY COUNT(*) DESC
将GROUP BY与元组中所需的所有不同列一起使用。然后ORDER BY COUNT函数。这将获得所有不同数字集的列表。要限制结果数,请在SELECT语句中包含TOP 10。
注意:原始帖子同时包含MySql和sql-server标记。此解决方案适用于SQL Server。在MySql中,TOP功能不存在,您需要使用具有类似功能的LIMIT。如果您需要有关如何使用它的更多信息,请参阅LIMIT documentation。
答案 1 :(得分:0)
要解决此问题,您需要执行以下操作:
让我给出一个可以在SQL Server中运行的解决方案,并在mysql中进行非常小的修改:
with allnums as (
select id, 1 as col, num1 as num from t union all
select id, 2 as col, num2 as num from t union all
select id, 3 as col, num3 as num from t union all
select id, 4 as col, num4 as num from t union all
...
)
select top x an1.num, an2.num, count(*)
from allnums an1 join
allnums an2
on an1.id = an2.id and
an1.col < an2.col
order by count(*) desc
我认为mysql不支持“with”语法,因此您需要重复子查询两次,将结果放在临时表中,或创建视图。
您还可以使用特定于数据库的构造表达相同的想法,例如SQL Server中的“unpivot”。这可以在一定程度上简化SQL,但不是很多。
如果每行没有唯一的id,那么在SQL Server中一件容易的事就是使用row_number()函数在另一个“with”语句中分配一个。或者,您可以将所有数字转换为字符串,然后将它们连接在一起。