Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma maneira mais simples de encontrar MODE (S) de alguns valores no MySQL


Você está muito perto da última consulta. O seguinte encontra um modo:
SELECT value, occurs
FROM (SELECT value,count(*) as occurs
      FROM t200
      GROUP BY `value`
      LIMIT 1
     ) T1

Acho que sua pergunta foi sobre vários modos:
SELECT value, occurs
FROM (SELECT value, count(*) as occurs
      FROM t200
      GROUP BY `value`
     ) T1
WHERE occurs = (select max(occurs)
                from (select `value`, count(*) as occurs
                      from t200
                      group by `value`
                     ) t
               );

EDITAR:

Isso é muito mais fácil em quase qualquer outro banco de dados. MySQL não suporta nem with nem funções de janela/analítica.

Sua consulta (mostrada abaixo) não faz o que você pensa que está fazendo:
  SELECT value, occurs  
  FROM (SELECT value, count(*) as occurs
        FROM t200
        GROUP BY `value`
       ) T1
  HAVING occurs = max(occurs) ; 

O having final cláusula refere-se à variável occurs mas usa max(occurs) . Por causa do uso de max(occurs) esta é uma consulta de agregação que retorna uma linha, resumindo todas as linhas da subconsulta.

A variável occurs não está usando para agrupamento. Então, que valor o MySQL usa? Ele usa um método arbitrário valor de uma das linhas na subconsulta. Esse valor arbitrário pode corresponder ou não. Mas, o valor vem apenas de uma linha. Não há iteração sobre ele.