2011-04-11 23 views
12

Tengo un problema al escribir una consulta para MySQL. He siguientes campos en la base de datosObtener el último registro de cada mes en MySQL ...?

id  created_on   status 
1  2011-02-15 12:47:09 1 
2  2011-02-24 12:47:09 1 
3  2011-02-29 12:47:09 1 
4  2011-03-11 12:47:09 1 
5  2011-03-15 12:47:09 1 
6  2011-03-22 12:47:09 1 
7  2011-04-10 12:47:09 1 
8  2011-04-11 12:47:09 1 

necesito select the last record of each month. Eso es para el month FEB record # 3month MARCH record # 6 y para month APRIL record # 8

favor me ayude .....

Gracias de antemano .....

+2

posible duplicado de [puedo usar la función de agregación (LAST) en mysql ??] (http://stackoverflow.com/questions/5495913/can-i-use-aggregation-function-last-in-mysql) –

+0

Verifique la respuesta que he publicado. Creo que responderá a tu pregunta. – reggie

+0

ver respuesta aceptada en http://stackoverflow.com/questions/1379565/mysql-first-and-last-record-of-a-grouped-record-aggregate-functions para una solución más eficiente – eyaler

Respuesta

3

La construcción de la respuesta de Dheer:

SELECT r.* 
FROM table AS r 
    JOIN (
     SELECT MAX(t.created_on) AS created_on 
     FROM table AS t 
     GROUP BY YEAR(t.created_on), MONTH(t.created_on) 
    ) AS x USING (created_on) 

Asegúrese de que tiene índices en created_on, de lo contrario esta consulta matará a su base de datos si la mesa se pone más de un par de cientos de filas.

+0

subconsulta toma más de 10 min para mí ... Tengo aprox. 28 entradas por día. La consulta de uniones tiene mucha mejoría ... gracias a que trabaja para mesas grandes. –

+0

¿Hay alguna forma de cambiar USING para ON? El framework que estoy usando solo parece usar ON pero obtengo una cantidad de resultados diferente –

+0

@RobertWent Sí: http://stackoverflow.com/a/11367066/175303 USING() es solo shortform para ON() así que el primero siempre se puede ampliar a este último. – Zimzat

2

Primero es necesario agrupar por año y mes (de lo contrario estarías filtrando meses en otros años). Use MAX() para obtener la fecha más grande para cada grupo.

SELECT *, MAX(created_on) FROM table 
GROUP BY YEAR(created_on), MONTH(created_on) 
+1

Esto, al igual que los dos últimos respuestas, no devolverá los resultados esperados. Al agrupar en resultados, MySQL no devolverá los resultados de fila esperados para los campos que no están en la agrupación. En otras palabras, los campos no agrupados son caóticos si coinciden con más de una fila. – Zimzat

+0

http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html Al utilizar esta función, todas las filas de cada grupo deben tener los mismos valores para las columnas omitidas de la parte GROUP BY. El servidor puede devolver cualquier valor del grupo, por lo que los resultados son indeterminados a menos que todos los valores sean los mismos. – Zimzat

8
SELECT * FROM table 
WHERE created_on in 
(select DISTINCT max(created_on) from table 
GROUP BY YEAR(created_on), MONTH(created_on)) 
+0

Gracias Reggie, Funciona ..... – Pushpendra

+1

Esto debe volver a escribirse para poner la subconsulta en un JOIN, de lo contrario, esto destruirá el rendimiento de la base de datos a medida que crezca la tabla: http://www.mysqlperformanceblog.com/ 2010/10/25/mysql-limitations-part-3-subqueries/ – Zimzat

+0

código de muestra @Zimzat, por favor – user2636556

2

Suponiendo que no es sólo un registro para el día;

SELECT * from table where created_on IN (Select MAX(created_on) FROM table 
GROUP BY YEAR(created_on), MONTH(created_on)) 
+0

Esto funcionará incluso si hay más de un registro por día. La única vez que esto fallará es si hay más de un registro por segundo, específicamente el último segundo del mes. Agregar una JUNTA IZQUIERDA más a la misma tabla para seleccionar en base a la ID más alta será la solución a este problema. – Zimzat

+0

Oh, también podría agregar que usar una subconsulta en 'IN' no es recomendable, ya que mata el rendimiento de MySQL. La base de datos ejecutará la consulta para cada fila en la tabla maestra. Sería mejor moverlo a una subconsulta JOIN. – Zimzat

Cuestiones relacionadas