gpt4 book ai didi

sql - 在 Oracle 中创建直方图/频率分布的最佳方法?

转载 作者:行者123 更新时间:2023-12-04 10:11:35 26 4
gpt4 key购买 nike

我有一个 events两列表格 eventkey (唯一的,主键)和 createtime ,它将事件的创建时间存储为自 1970 年 1 月 1 日以来的毫秒数 NUMBER柱子。

我想创建一个“直方图”或频率分布,显示在过去一周的每个小时内创建了多少事件。

这是在 Oracle 中使用 width_bucket() 编写此类查询的最佳方法吗?功能?是否可以使用其他 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

最佳答案

如果您的 createtime是一个日期列,这将是微不足道的:

SELECT TO_CHAR(CREATE_TIME, 'DAY:HH24'), COUNT(*) 
FROM EVENTS
GROUP BY TO_CHAR(CREATE_TIME, 'DAY:HH24');

照原样,类型转换 createtime列不太难:
select TO_CHAR( 
TO_DATE('19700101', 'YYYYMMDD') + createtime / 86400000),
'DAY:HH24') AS BUCKET, COUNT(*)
FROM EVENTS
WHERE createtime between 1305504000000 and 1306108800000
group by TO_CHAR(
TO_DATE('19700101', 'YYYYMMDD') + createtime / 86400000),
'DAY:HH24')
order by 1

或者,如果您正在寻找围栏值(例如,我从第一个十分位数 (0-10%) 到下一个 (11-20%) 的位置),您可以执行以下操作:
select min(createtime) over (partition by decile) as decile_start,
max(createtime) over (partition by decile) as decile_end,
decile
from (select createtime,
ntile (10) over (order by createtime asc) as decile
from events
where createtime between 1305504000000 and 1306108800000
)

关于sql - 在 Oracle 中创建直方图/频率分布的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6201992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com