次のようなテーブルがあります。
ランクレター 1A 2A 3B 4A 5C 6A 7C 8C 9B 10℃
そして、昇順で並べられた各文字の上位 2 つが必要です。
ランクレター 1A 2A 3B 5C 7C 9B
どうすればいいですか?GROUP BY を使用してトップ 1 だけを取得するのはかなり簡単ですが、複数のエントリに対して機能させることはできないようです
SELECT mo.Letter, md.Rank
FROM (
SELECT DISTINCT letter
FROM mytable
) mo
JOIN mytable md
ON md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
AND Rank <=
COALESCE
(
(
SELECT Rank
FROM mytable mi
WHERE mi.letter = mo.letter
ORDER BY
Rank
LIMIT 1, 1
),
0xFFFFFFFF
)
(Letter, Rank)
(この順序で)複合インデックスが必要です
この構成に注意してください。
md.Letter >= mo.Letter
AND md.Letter <= mo.Letter
ただの代わりにmd.Letter = mo.Letter
Range checked for each record
どちらがより効率的かを強制します。
私のブログでこの記事を参照してください。
詳細については、こちらをご覧ください。
select distinct rank, letter
from table1 t2
where rank in
(select top 2 rank
from table1 t2
where t2.letter = t1.letter
order by rank)
order by letter, rank
編集:(私の最初の試行はMySql(Quassnoiコメント)では機能しません。たとえば、SQLサーバーで機能するように変更しました)
2回目の試行:
select t.letter, t.rank
from table1 t
join (
select t1.letter, min(t1.rank) m
from table1 t1
join (select t0.letter, min(t0.rank) m, count(1) c
from table1 t0 group by t0.letter) t2
on t1.letter = t2.letter and ((t2.c = 1) or (t2.c > 1 and t1.rank > m))
group by t1.letter) t3
on t.letter = t3.letter and t.rank <= t3.m