Pregunta

Tengo una gran mesa-ish de Oracle que contiene filas que representan unidades de trabajo, con columnas para la hora de inicio y hora de finalización, además de otros metadatos.

necesito para generar gráficos de uso de estos datos, teniendo en cuenta algunos criterios de filtrado arbitrarias y un período de tiempo de informe. Por ejemplo, me muestran un gráfico de todos los trabajos de Alice para el período de 24 horas a partir del martes pasado a las 7:00 am. Cada fila DB apilará verticalmente en el gráfico.

Yo podría hacer esto en un lenguaje de alto nivel mediante la consulta de todas las filas potencialmente relevantes, tiempo de corte de cubos cada uno dentro de 1 minuto, y graficar el resultado. Pero, ¿existe una forma eficaz de hacer esto segmentación de tiempo en SQL? ¿O hay una tecnología de Oracle existente que hace esto?

Gracias!

¿Fue útil?

Solución

En términos de conseguir los datos de salida, puede utilizar 'agrupar por' y ' truncar ' para rebanar los datos en intervalos de 1 minuto. por ejemplo:

SELECT user_name, truncate(event_time, 'YYYYMMDD HH24MI'), count(*)
FROM job_table
WHERE event_time > TO_DATE( some start date time)
AND user_name IN ( list of users to query )
GROUP BY user_name, truncate(event_time, 'YYYYMMDD HH24MI') 

Esto le dará resultados como a continuación (asumiendo que hay 20 filas para Alice entre 8,00 y 8,01 y 40 filas entre 8,01 y 8,02):

Alice  2008-12-16 08:00   20
Alice  2008-12-16 08:01   40

Otros consejos

Su mejor opción es tener una tabla (una temporal generada sobre la marcha estaría bien si el intervalo de tiempo es dinámica) y luego unirse en contra de eso.

Esto debería hacerlo bastante bien. Se interrupción de la voluntad al minuto (1/1440 de un día).

SELECT 
  to_char(Times.time,'hh24:mi'),
  count(*)   
FROM   
  (SELECT
     time
   FROM  
     dual
   WHERE 
     1=2 
   MODEL 
     dimension by ( 0 as key )
     measures     ( sysdate -1 as time )
     rules upsert ( time[ for key from 0 to 1 increment (1/1440) ] = sysdate-1 + cv(key)) ) Times,
  job_table
WHERE 
  begintime <= Times.time 
AND 
  endtime > Times.time 
AND
  user_name = 'Alice'
GROUP BY 
  Times.time 
ORDER BY
  Times.time

Estoy seguro de que hay una manera más rápida de hacer esto, pero esto es lo mejor que puedo llegar a. Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top