我有一个包含两列eventkey
(唯一主键)和createtime
的events
表,它将事件的创建时间存储为自1970年1月1日以来以毫秒为单位的数字,存储在一个NUMBER
列中。
我想创建一个“直方图”或频率分布,显示过去一周内每个小时创建了多少个事件。
这是在Oracle中编写此类查询的最佳方法吗?是否可以使用其他Oracle分析函数之一推导出落入每个桶中的行数,而不是使用width_bucket()
函数确定每行属于哪个桶号并对其进行count(*)
?
-- 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