7

次のようなテーブルがあります。

ランクレター
1A
2A
3B
4A
5C
6A
7C
8C
9B
10℃

そして、昇順で並べられた各文字の上位 2 つが必要です。

ランクレター
1A
2A
3B
5C
7C
9B

どうすればいいですか?GROUP BY を使用してトップ 1 だけを取得するのはかなり簡単ですが、複数のエントリに対して機能させることはできないようです

4

2 に答える 2

7
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どちらがより効率的かを強制します。

私のブログでこの記事を参照してください。

詳細については、こちらをご覧ください。

于 2009-10-08T12:58:30.400 に答える
2
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
于 2009-10-08T13:31:32.207 に答える