segmentación de tiempo en Oracle / SQL
-
22-08-2019 - |
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!
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.