选择最频繁

时间:2012-05-21 17:31:30

标签: mysql sql sql-server

我是否有可能找到使用sql表中出现的最频繁的数字对。即: 我填写了数字的列数很少:

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

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

请告诉我是否可能,或者我应该采取“蛮力”的解决方案。

此致

2 个答案:

答案 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)

要解决此问题,您需要执行以下操作:

  1. 取消透视列
  2. 执行自我加入以获得对
  3. 总结以获得最常见的配对。
  4. 让我给出一个可以在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”语句中分配一个。或者,您可以将所有数字转换为字符串,然后将它们连接在一起。