Dla n=2 możesz
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)
dla każdego n możesz użyć metod opisanych tutaj symulować rangę na partycji.
EDYCJA:Właściwie to artykuł da ci dokładnie to, czego potrzebujesz.
Zasadniczo jest to coś takiego
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
Zastąp grouper
z nazwą kolumny, według której chcesz pogrupować i val
z nazwą kolumny, w której przechowywane są wartości.
Aby dowiedzieć się, jak dokładnie działa, przejdź krok po kroku od najbardziej wewnętrznego zapytania i uruchom je.
Istnieje również niewielkie uproszczenie - podzapytanie, które znajduje mid
może zwrócić NULL, jeśli dana kategoria nie ma wystarczającej liczby wartości, więc powinno być ZŁĄCZENIE tego z jakąś stałą, która miałaby sens w porównaniu (w twoim przypadku byłoby to MIN domeny wartości, w artykule jest to MAX).
EDIT2: Zapomniałem wspomnieć, że to LIMIT 2,1 określa n (LIMIT n,1).