sql >> Database teknologi >  >> RDS >> Mysql

MySQL Group By med top N-nummer af hver slags

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 skal have et sammensat indeks på (Letter, Rank) (i denne rækkefølge)

Bemærk denne konstruktion:

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

i stedet for blot md.Letter = mo.Letter

Det tvinger Range checked for each record hvilket er mere effektivt.

Se denne artikel i min blog:

for flere detaljer om dette.



  1. Analyse af PostgreSQL-tabelstatistik

  2. Databasedesign til skolegangssystem

  3. Brug sammensat primærnøgle som fremmednøgle

  4. Sådan overvåger du forbindelsespooling for .NET MySQL Data Connector i IIS