GRUPO POR tener una date MAX

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 date 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 command SQL que se pueda ejecutar más rápido que la consulta anterior?

Gracias por adelantado.

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 performance.

Es mejor ejecutar la subconsulta una vez, en la cláusula FROM, para get la date 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); 

No es necesario 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) 

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 context de HAVING , MAX encuentra el máximo de cada grupo. Solo la última input en cada grupo satisfará date_updated=max(date_updated) . Si hay un empate para lo último dentro de un grupo, ambos pasarán el filter HAVING , pero GROUP BY significa que solo uno aparecerá en la tabla devuelta.