Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql selecione os valores máximos n máximos


Para n=2 você poderia
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)

para qualquer n, você pode usar as abordagens descritas aqui para simular a classificação sobre a partição.

EDIT:Na verdade isto artigo lhe dará exatamente o que você precisa.

Basicamente é algo assim
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

Substituir grouper com o nome da coluna pela qual você deseja agrupar e val com o nome da coluna que contém os valores.

Para descobrir como exatamente funciona, vá passo a passo da consulta mais interna e execute-a.

Além disso, há uma pequena simplificação - a subconsulta que encontra o mid pode retornar NULL se determinada categoria não tiver valores suficientes então deve haver COALESCE disso para alguma constante que faria sentido na comparação (no seu caso seria MIN de domínio do val, no artigo é MAX).

EDIT2: Esqueci de mencionar que é o LIMIT 2,1 que determina o n (LIMIT n,1).