sql >> Database >  >> RDS >> Mysql

mysql selecteer top n max waarden

Voor n=2 zou je kunnen

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)

voor elke n zou je de benaderingen kunnen gebruiken die hier om rang over partitie te simuleren.

EDIT:Eigenlijk dit artikel geeft je precies wat je nodig hebt.

Eigenlijk is het zoiets als dit

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

Vervang grouper met de naam van de kolom waarop u wilt groeperen en val met de naam van de kolom die de waarden bevat.

Om erachter te komen hoe het precies werkt, ga je stap voor stap van de meest innerlijke query en voer je ze uit.

Er is ook een kleine vereenvoudiging - de subquery die de mid . vindt kan NULL retourneren als een bepaalde categorie niet genoeg waarden heeft, dus daar zou COALESCE van moeten zijn met een constante die logisch zou zijn in de vergelijking (in jouw geval zou het MIN van het domein van de val zijn, in artikel is het MAX).

EDIT2: Ik vergat te vermelden dat het de LIMIT 2,1 is die de n bepaalt (LIMIT n,1).



  1. Gebruikersaccountbeheer, rollen, machtigingen, authenticatie PHP en MySQL -- Deel 5

  2. 3 manieren om het kolomgegevenstype in Oracle te controleren

  3. Tekenen dat uw database niet langer voor u werkt

  4. CHARINDEX() vs PATINDEX() in SQL Server - Wat is het verschil?