sql >> Databasteknik >  >> RDS >> Mysql

mysql välj topp n max värden

För n=2 kan du

SELECT max(column1) m 
FROM table t
GROUP BY column2
UNION
SELECT max(column1) m
FROM table t
WHERE column1 NOT IN (SELECT max(column1) 
                      WHERE column2 = t.column2)

för alla n kan du använda metoder som beskrivs här för att simulera rang över partition.

EDIT:Faktiskt det här artikeln ger dig exakt vad du behöver.

I grund och botten är det ungefär så här

SELECT t.*
FROM
   (SELECT grouper,
          (SELECT val 
           FROM table li
           WHERE li.grouper = dlo.grouper
           ORDER BY
                 li.grouper, li.val DESC
           LIMIT 2,1) AS mid
   FROM 
      (
      SELECT DISTINCT grouper
      FROM table
      ) dlo 
   ) lo, table t
WHERE t.grouper = lo.grouper
      AND t.val > lo.mid

Ersätt grouper med namnet på kolumnen du vill gruppera efter och val med namnet på kolumnen som innehåller värdena.

För att ta reda på exakt hur det fungerar, gå steg-för-steg från den mest inre frågan och kör dem.

Det finns också en liten förenkling - underfrågan som hittar mid kan returnera NULL om en viss kategori inte har tillräckligt med värden så det borde finnas COALESCE av det till någon konstant som skulle vara vettigt i jämförelsen (i ditt fall skulle det vara MIN för domänen för valet, i artikeln är det MAX).

EDIT2: Jag glömde att nämna att det är LIMIT 2,1 som bestämmer n (LIMIT n,1).



  1. PostgreSQL 9.1:Hur man sammanfogar rader i array utan dubbletter, GÅ MED i en annan tabell

  2. Skillnaden mellan multi-statement tabell-värderade funktioner och inline tabell-värderade funktioner i SQL Server

  3. Kommer UUID som primärnyckel i PostgreSQL att ge dålig indexprestanda?

  4. SQL Server AlwaysOn ( Tillgänglighetsgrupp ) Arkitektur och steg för steg installation -4 Lägg till och ta bort databas steg