繁体   English   中英

选择最频繁

[英]Select most frequent

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

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

当然,行数更大,但是您有个主意。目标是显示例如10对数字,这些数字出现在行中。

请让我知道是否可能,否则我应该执行一种“强力”解决方案。

问候

尝试这个。

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与您要在元组中使用的所有不同列一起使用。 然后,按COUNT函数排序。 这将获得所有不同数字集的列表。 要限制结果数量,请在SELECT语句中包括TOP 10。

注意:原始帖子同时具有MySql和sql-server标记。 此解决方案在SQL Server中有效。 在MySql中,TOP功能不存在,您需要使用具有类似功能的LIMIT 如果您需要更多有关如何使用它的信息,请参考LIMIT文档

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

  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中很容易做到的是使用row_number()函数在另一个“ with”语句中分配一个。 或者,您可以将所有数字转换为字符串,然后将它们连接在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM