Mysql
 sql >> Base de données >  >> RDS >> Mysql

mysql sélectionne les n premières valeurs maximales

Pour n=2 vous pourriez

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)

pour tout n, vous pouvez utiliser les approches décrites ici pour simuler le rang sur la partition.

EDIT :En fait ceci cet article vous donnera exactement ce dont vous avez besoin.

En gros, c'est quelque chose comme ça

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

Remplacer grouper avec le nom de la colonne par laquelle vous souhaitez regrouper et val avec le nom de la colonne qui contient les valeurs.

Pour comprendre comment cela fonctionne exactement, allez étape par étape à partir de la requête la plus interne et exécutez-les.

De plus, il y a une légère simplification - la sous-requête qui trouve le mid peut renvoyer NULL si certaines catégories n'ont pas assez de valeurs, il devrait donc y avoir COALESCE de cela à une constante qui aurait du sens dans la comparaison (dans votre cas, ce serait MIN du domaine de la val, dans l'article, c'est MAX) .

EDIT2 : J'ai oublié de préciser que c'est la LIMITE 2,1 qui détermine le n (LIMITE n,1).