sql >> データベース >  >> RDS >> Mysql

各種類の上位N個のMySQLGroupBy

    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を強制します これはより効率的です。

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

    詳細については、



    1. 分をHH24:MI形式に変換する

    2. 一意の識別子なしで重複する行を削除する方法

    3. Excel VBAスクリプトからOracleストアドプロシージャを呼び出すにはどうすればよいですか?

    4. JavaMySQLJDBCメモリリーク