n =2の場合、次のことができます
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)
どのnについても、ここで説明されているアプローチを使用できます パーティション上のランクをシミュレートします。
編集:実際にはこれ 記事はあなたが必要なものを正確に提供します。
基本的にはこんな感じです
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
grouper
を置き換えます グループ化する列の名前とval
値を保持する列の名前を使用します。
それがどのように機能するかを正確に理解するには、最も内側のクエリから段階的に実行して実行します。
また、わずかに単純化されています-mid
を見つけるサブクエリ 特定のカテゴリに十分な値がない場合はNULLを返す可能性があるため、比較で意味のある定数へのCOALESCEが必要です(この場合、valのドメインのMINになり、記事ではMAXになります)。
編集2: n(LIMIT n、1)を決定するのはLIMIT2,1であることを忘れました。