2011-05-26 58 views
9

Estoy tratando de hacer una consulta que obtenga datos por hour pero en lugar del grupo normal por hora, quiero restringirlo y obtener solo el latest hora - es decir, los datos más nuevos dentro de esa hora. Con la imagen que se muestra a continuación, lo que quería obtener son las filas con recuadros rojos. Si se dará cuenta, la primera fila roja es 10:59:51, lo que significa que es la única fila que está dentro de 10:00:00 y 10:59:59. Para el resto de las filas que están en 12:00 y superiores, quería obtener 12:37:14 porque es la última o más reciente para ese rango de horas.MySQL: Cómo agrupar datos por hora y obtener la última hora

enter image description here

Tengo una consulta sencilla que agrupa los datos por hour usando HOUR() como:

SELECT userid, username, date_created 
FROM user_accounts 
WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59' 
GROUP BY HOUR(date_created) 

La consulta, sin embargo, es sólo la agrupación por hora 10 y 12 que devuelve Identificación 24 y 25 - pero lo que necesitaba es id24 y 28. ¿Algunas ideas?

+0

también intente con mi respuesta; está optimizado – diEcho

Respuesta

19

Trate

SELECT f.* 
FROM (
     SELECT MAX(UNIX_TIMESTAMP(date_created)) AS mts 
     FROM user_accounts 
     GROUP BY HOUR(date_created) 
     ) s 
JOIN user_accounts f 
ON  UNIX_TIMESTAMP(date_created) = s.mts 
WHERE DATE(date_created) = '2009-10-27' 
+1

Solución perfecta @diEcho ... Thankx – AndroidDanger

+0

Esto devolvió una sola fila para '2009-10-27' y no es lo que esperaba. – tradyblix

+0

@trady blix, ¿lo has comprobado? Lo probé ya – diEcho

5

Quizás esto funcione?

SELECT userid, username, date_created 
FROM user_accounts 
WHERE userid IN (
    SELECT MAX(userid) 
    FROM user_accounts 
    WHERE date_created >= '2009-10-27 00:00:00' AND date_created < '2009-10-27 23:59:59' 
    GROUP BY HOUR(date_created) 
) 
+0

+1 me ganó por segundos :) –

+0

No puede suponer que MAX (id) significa MAX (date_created), especialmente cuando solo puede usar MAX (date_created) sin la necesidad de una consulta anidada. – GordyD

+0

¡Impresionante!Nunca pensé en usar una sub-selección y al usar 'MAX 'puedes obtener la ID más alta dentro del' HOUR (date_created) '. Intenté esto y funciona, ¡gracias! :) – tradyblix

0

¿Quieres decir Dentro de una hora o última hora completa? Si es la última hora completa, algo como esto podría funcionar?

SELECT userid, username, date_created 
FROM user_accounts 
WHERE HOUR(date_created) = (SELECT HOUR(date_created) FROM user_accounts ORDER BY date_created DESC LIMIT 1); 

EDIT: Ahhh, ahora creo que entiendo lo que quiere ... La última entrada agregado en cada hora dada entre el intervalo de fechas?

Si es así, la consulta de Codler es lo que desea.

1

Tendría que suponer que también lo desea de día si abarca varios días, de lo contrario un máximo() por hora podría darle algo de hace una semana con una hora contra tres días atrás otra, y día actual con otro más ... Eso, todo si abarcaste fuera de tu cláusula DONDE limita específicamente a tu rango de un solo día. No es el usuario específico que desea, pero quien tuvo la última actividad durante esa hora ... podría ser la misma persona, podría ser completamente diferente cada vez. Estoy viradas en la fecha específica como parte de mi grupo de prueba en caso de que alguna vez quiso abarcar un intervalo de fechas, pero se puede llevar a cabo también ...

select STRAIGHT_JOIN 
     ui.userid, 
     ui.username, 
     ui.date_created 
    from 
     (select 
       date(date_created), 
       hour(date_created), 
       max(date_created) as LastPerHour 
      from 
       user_accounts 
      where 
       date(date_created) = '2009-10-27' 
      group by 
       date(date_created), 
       hour(date_created)) PreQuery 
     join user_accounts ui 
     on PreQuery.LastPerHour = ui.date_created 

Una vez más, he incluido la fecha como agrupación también si desea abarcar varios días, simplemente asegúrese de que su tabla tenga un índice en date_created por sí mismo ... o al menos en la primera posición del índice.

+0

Puedo vivir con solo usar 'MAX' solo, pero agradezco su respuesta ya que lo he probado y funciona. Me referiré a tu solución cuando llegue el momento en que la necesite. +1 :) – tradyblix

+0

@tradyblix, sí, me gusta la otra solución que solo usa la identificación máxima de usuario por hora ... pero que solo funcionará (como lo hacen sus datos) la columna en cuestión es de un incremento automático . Ahora, si estuviera tratando de encontrar la última vez que alguien estaba HACIENDO algo, como un Historial de REGISTRO, donde el usuario 1 era el último usuario en una hora dada, frente al usuario 25, entonces esta sería su solución ... Espero que comprenda el contexto diferente por qué una consulta frente a la otra. – DRapp

0

que utilizan esta solución

select date(PROCESS_DATE),hour(PROCESS_DATE),EVENT,COUNT(*) from statistics group by EVENT,date(PROCESS_DATE),time(PROCESS_TIME) order by 1 desc, 2 desc limit 1; 

Esperanza esto ayuda a alguien.

Cuestiones relacionadas