Tengo una tabla events
con dos columnas eventkey
(única, clave principal) y createtime
, que almacena la hora de creación del evento como el número de milisegundos desde el 1 de enero de 1970 en una columna NUMBER
.¿Forma óptima de crear una distribución de histograma/frecuencia en Oracle?
Me gustaría crear un "histograma" o distribución de frecuencia que me muestre cuántos eventos se crearon en cada hora de la semana pasada.
¿Es esta la mejor manera de escribir una consulta de este tipo en Oracle, utilizando la función width_bucket()
? ¿Es posible derivar el número de filas que caen en cada segmento usando una de las otras funciones analíticas de Oracle en lugar de usar width_bucket
para determinar a qué número de segmento pertenece cada fila y hacer un count(*)
sobre eso?
-- 1305504000000 = 5/16/2011 12:00am GMT
-- 1306108800000 = 5/23/2011 12:00am GMT
select
timestamp '1970-01-01 00:00:00' + numtodsinterval((1305504000000/1000 + (bucket * 60 * 60)), 'second') period_start,
numevents
from (
select bucket, count(*) as events from (
select eventkey, createtime,
width_bucket(createtime, 1305504000000, 1306108800000, 24 * 7) bucket
from events
where createtime between 1305504000000 and 1306108800000
) group by bucket
)
order by period_start
esto funciona bien, gracias. No estoy seguro de por qué no pensé simplemente en truncar las fechas en primer lugar, creo que me puse tan al corriente de cómo analizar y emitir este extraño formato de "fecha" –
¿Hay alguna forma de mantener filas para create_times que tengan un conteo cero? –