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