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.
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);
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.
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)
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.
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