Voor n=2 zou je kunnen
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)
voor elke n zou je de benaderingen kunnen gebruiken die hier om rang over partitie te simuleren.
EDIT:Eigenlijk dit artikel geeft je precies wat je nodig hebt.
Eigenlijk is het zoiets als dit
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
Vervang grouper
met de naam van de kolom waarop u wilt groeperen en val
met de naam van de kolom die de waarden bevat.
Om erachter te komen hoe het precies werkt, ga je stap voor stap van de meest innerlijke query en voer je ze uit.
Er is ook een kleine vereenvoudiging - de subquery die de mid
. vindt kan NULL retourneren als een bepaalde categorie niet genoeg waarden heeft, dus daar zou COALESCE van moeten zijn met een constante die logisch zou zijn in de vergelijking (in jouw geval zou het MIN van het domein van de val zijn, in artikel is het MAX).
EDIT2: Ik vergat te vermelden dat het de LIMIT 2,1 is die de n bepaalt (LIMIT n,1).