mysql sql optimization greatest-n-per-group

mysql - GRUPO POR tener una fecha MAX



postgresql max date (4)

Tengo un problema al ejecutar este código:

SELECT * FROM tblpm n WHERE date_updated=(SELECT MAX(date_updated) FROM tblpm GROUP BY control_number HAVING control_number=n.control_number)

Básicamente, quiero devolver la fecha más reciente para cada número de control. La consulta anterior arroja la salida correcta, pero demora 37 segundos. antes de que se muestre la salida

¿Hay alguna otra cláusula o comando SQL que se pueda ejecutar más rápido que la consulta anterior?

Gracias por adelantado.


No hay necesidad de agrupar en esa subconsulta ... una cláusula where sería suficiente:

SELECT * FROM tblpm n WHERE date_updated=(SELECT MAX(date_updated) FROM tblpm WHERE control_number=n.control_number)

Además, ¿tiene un índice en la columna ''date_updated''? Eso sin duda ayudaría.


Otra forma que no utiliza el grupo por:

SELECT * FROM tblpm n WHERE date_updated=(SELECT date_updated FROM tblpm n ORDER BY date_updated desc LIMIT 1)


Poner la subconsulta en la cláusula WHERE y restringirla a n.control_number significa que ejecuta la subconsulta muchas veces. Esto se denomina subconsulta correlacionada , y a menudo es un asesino de rendimiento.

Es mejor ejecutar la subconsulta una vez, en la cláusula FROM, para obtener la fecha máxima por número de control.

SELECT n.* FROM tblpm n INNER JOIN ( SELECT control_number, MAX(date_updated) AS date_updated FROM tblpm GROUP BY control_number ) AS max USING (control_number, date_updated);


Rápido y fácil con TENER:

SELECT * FROM tblpm n FROM tblpm GROUP BY control_number HAVING date_updated=MAX(date_updated);

En el contexto de HAVING , MAX encuentra el máximo de cada grupo. Solo la última entrada en cada grupo satisfará date_updated=max(date_updated) . Si hay un empate para lo último dentro de un grupo, ambos pasarán el filtro HAVING , pero GROUP BY significa que solo uno aparecerá en la tabla devuelta.