【问题标题】:MySql : retrieve most occurring value in column for another columnMySql:为另一列检索列中出现次数最多的值
【发布时间】:2016-12-14 20:56:14
【问题描述】:

我正在寻找一种在 MySql 中选择一列中出现次数最多的值的方法。

例如这张表

+-------+-------+
|  Name | Signin|
+-------+-------+
| Name1 |   1   |
| Name1 |   2   |
| Name1 |   1   |
| Name1 |   3   |
| Name1 |   2   |
| Name1 |   2   |
| Name2 |   4   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   5   |
| Name2 |   6   |
+-------+-------+

Signin 列有两个=1,三个=2,一个=3,对于 Name1,最近的值为 2,对于 Name2,最近的值为 5,因为在 Signin 列中是 one=4,四=5,一=6

我需要的结果是这样的

Name1 - 2
Name2 - 5

【问题讨论】:

标签: php mysql sql


【解决方案1】:

您正在寻找的东西在统计中被称为“模式”。大多数数据库都支持简化计算的 CTE 或窗口函数。如果您的数据不是太大,我认为以下聚合技巧是最简单的方法:

select name,
       substring_index(group_concat(signin order by cnt desc), ',', 1) as signin
from (select name, signin, count(*) as cnt
      from t
      group by name, signin
     ) ns
group by name;

上述方法并不总是有效。一种可能性是 sgeddes 使用两种聚合的方法。另一种是使用变量:

select ns.*
from (select ns.*,
             (@rn := if(@n = name, @rn + 1,
                        if(@n := name, 1, 1)
                       )
             ) as rn
      from (select name, signin, count(*) as cnt
            from t
            group by name, signin
            order by name, count(*) desc
           ) ns cross join
           (select @n := '', @rn := 0) params
     ) ns
where seqnum = 1;

【讨论】:

  • 感谢您的回答。万事如意
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
  • 2013-06-06
  • 2020-12-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多