sql >> Base de Datos >  >> RDS >> Mysql

mysql selecciona los mejores valores n max

Para n=2 podrías

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 cualquier n podría usar los enfoques descritos aquí para simular el rango sobre la partición.

EDITAR:En realidad esto artículo le dará exactamente lo que necesita.

Básicamente es algo como esto

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

Reemplazar grouper con el nombre de la columna por la que desea agrupar y val con el nombre de la columna que contiene los valores.

Para averiguar cómo funciona exactamente, vaya paso a paso desde la consulta más interna y ejecútela.

Además, hay una ligera simplificación:la subconsulta que encuentra el mid puede devolver NULL si cierta categoría no tiene suficientes valores, por lo que debe COALESCE de eso a alguna constante que tenga sentido en la comparación (en su caso, sería MIN del dominio del valor, en el artículo es MAX).

EDIT2: Olvidé mencionar que es el LÍMITE 2,1 el que determina el n (LÍMITE n,1).