sql >> Databasteknik >  >> RDS >> Mysql

MySQL Group By med topp N-nummer av varje slag

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
                )

Du måste ha ett sammansatt index på (Letter, Rank) (i denna ordning)

Notera denna konstruktion:

md.Letter >= mo.Letter
AND md.Letter <= mo.Letter

istället för bara md.Letter = mo.Letter

Den tvingar Range checked for each record vilket är mer effektivt.

Se den här artikeln i min blogg:

för mer information om detta.



  1. MySQL:ignorera fel vid import?

  2. enkel fast tabell med flera kolumner kontra flexibla abstrakta tabeller

  3. ODP.NET Managed library löser alias, men 32-bitars bibliotek gör det

  4. GROUP BY med MAX(DATE)