0

如果有可能使用 sql 找出出现在表中的最频繁的数字对,我会发现它。即:我有几列填充了数字:

num1, num2, num3, num4, num5, num6
2      3      4     5     6    7

当然行数更大,但你有一个想法。目标是显示例如 10 对出现在行中的数字。

如果可能,请告诉我,或者我宁愿执行“蛮力”解决方案。

问候

4

2 回答 2

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 文档。

于 2012-05-21T17:36:50.393 回答
1

为了解决这个问题,您需要执行以下操作:

  1. 取消透视列
  2. 执行自连接以获得对
  3. 总结以获得最常见的配对。

让我给出一个可以在 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 中做的一件简单的事情就是在另一个“with”语句中使用 row_number() 函数来分配一个。或者,您可以将所有数字转换为字符串,然后将它们连接在一起。

于 2012-05-21T17:53:39.817 回答