GRUPO POR tener fecha MÁXIMA


Tengo problemas 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 devuelve la salida correcta, pero tarda 37 segundos. antes de que se mostrara la salida.

¿Hay alguna otra cláusula o comando sql que pueda ejecutarse más rápido que la consulta anterior?

Gracias de antemano.

Author: Bill Karwin, 2013-08-14

4 answers

Poner la subconsulta en la cláusula WHERE y restringirla a n.control_number significa que ejecuta la subconsulta muchas veces. Esto se llama una subconsulta correlacionada , y a menudo es un asesino del 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);
 87
Author: Bill Karwin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 02:08:57

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.

 12
Author: Micah Hahn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-14 02:03:00

Otra forma que no usa grupo por:

SELECT * FROM tblpm n 
  WHERE date_updated=(SELECT date_updated FROM tblpm n 
                        ORDER BY date_updated desc LIMIT 1)
 -1
Author: Claudio Shigueo Watanabe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-31 12:13:16

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 de cada grupo satisfará date_updated=max(date_updated). Si hay un empate para latest dentro de un grupo, ambos pasarán el filtro HAVING, pero GROUP BY significa que solo aparecerá uno en la tabla devuelta.

 -3
Author: jaiwithani,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-14 10:54:42