2016-08-08 3 views
-1

Я ищу способ в MySql, чтобы выбрать наиболее часто встречающееся значение в одном столбце.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, как и в колонке зарегистрировались являются один = 4, четыре = 5, одна = 6

в результате мне нужно как этот

Name1 - 2 
Name2 - 5 
+1

Возможный дубликат [Использование графа найти количество вхождений] (http://stackoverflow.com/questions/7654978/using-count-to-find-the-number- случаев) –

ответ

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; 
+0

Благодарим вас за ответ, который он выполняет. Всего наилучшего – user3255412