我在MySql中寻找一种方法来选择一列中出现最多的值。
E.g。这张表
+-------+-------+
| 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是一个= 4,四= 5,一= 6
我需要的结果是这样的
Name1 - 2
Name2 - 5
答案 0 :(得分: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;