Für n=2 könnten Sie
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)
für jedes n könnten Sie Ansätze verwenden, die hier
BEARBEITEN:Eigentlich dies Artikel wird Ihnen genau das geben, was Sie brauchen.
Im Grunde ist es ungefähr so
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
Ersetzen Sie grouper
mit dem Namen der Spalte, nach der Sie gruppieren möchten, und val
mit dem Namen der Spalte, die die Werte enthält.
Um herauszufinden, wie genau es funktioniert, gehen Sie Schritt für Schritt von der innersten Abfrage aus und führen Sie sie aus.
Außerdem gibt es eine leichte Vereinfachung - die Unterabfrage, die mid
findet kann NULL zurückgeben, wenn eine bestimmte Kategorie nicht genügend Werte hat, also sollte es COALESCE davon zu einer Konstante geben, die im Vergleich sinnvoll wäre (in Ihrem Fall wäre es MIN der Domäne des Werts, in Artikel ist es MAX).
EDIT2: Ich habe vergessen zu erwähnen, dass das LIMIT 2,1 das n bestimmt (LIMIT n,1).