Mysql
 sql >> Database >  >> RDS >> Mysql

C'è un modo più semplice per trovare MODE(S) di alcuni valori in MySQL

Sei molto vicino con l'ultima domanda. Quanto segue ne trova uno modalità:

SELECT value, occurs
FROM (SELECT value,count(*) as occurs
      FROM t200
      GROUP BY `value`
      LIMIT 1
     ) T1

Penso che la tua domanda riguardasse più modalità, però:

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
               );

MODIFICA:

Questo è molto più semplice in quasi tutti gli altri database. MySQL non supporta né with né funzioni finestra/analitiche.

La tua query (mostrata di seguito) non fa ciò che pensi stia facendo:

  SELECT value, occurs  
  FROM (SELECT value, count(*) as occurs
        FROM t200
        GROUP BY `value`
       ) T1
  HAVING occurs = max(occurs) ; 

L'ultimo having la clausola si riferisce alla variabile occurs ma usa max(occurs) . A causa dell'uso di max(occurs) questa è una query di aggregazione che restituisce una riga, riassumendo tutte le righe della sottoquery.

La variabile occurs non sta usando per il raggruppamento. Quindi, quale valore utilizza MySQL? Usa un arbitrario valore da una delle righe nella sottoquery. Questo valore arbitrario potrebbe corrispondere o meno. Ma il valore viene solo da una riga. Non c'è alcuna iterazione su di esso.