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

mysql seleziona i primi n valori massimi

Per n=2 potresti

SELECT max(column1) m 
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) 
                      WHERE column2 = t.column2)

per ogni n è possibile utilizzare gli approcci descritti qui per simulare il rango su partizione.

EDIT:In realtà questo l'articolo ti darà esattamente ciò di cui hai bisogno.

Fondamentalmente è qualcosa del genere

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val 
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY
                 li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (
      SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid

Sostituisci grouper con il nome della colonna per cui vuoi raggruppare e val con il nome della colonna che contiene i valori.

Per capire come funziona esattamente, vai passo dopo passo dalla query più interna ed eseguile.

Inoltre, c'è una leggera semplificazione:la sottoquery che trova il mid può restituire NULL se una determinata categoria non ha valori sufficienti, quindi dovrebbe esserci COALESCE di quello su una costante che avrebbe senso nel confronto (nel tuo caso sarebbe MIN del dominio di val, nell'articolo è MAX).

EDIT2: Dimenticavo di dire che è il LIMITE 2,1 che determina la n (LIMITE n,1).