如何在Oracle SQL中按小时统计每15秒间隔的平均请求数
解决方案
首先明确需求:计算每个人每小时内的每15秒平均请求数,核心逻辑是:每小时有 3600秒 / 15秒 = 240 个15秒间隔,用该小时的总请求数除以240,得到每15秒的平均请求数。
原SQL的问题
GROUP BY RequestDateTable.rDATE会按完整的日期时间分组,而非小时维度,无法聚合同一小时内的请求数据COUNT(EXTRACT(SECOND ...))逻辑错误,应使用COUNT(*)统计该小时内的总请求数- 缺少平均值计算步骤,未将总请求数转换为每15秒的均值
修正后的SQL
SELECT pt.Person AS person, CONCAT('from ', EXTRACT(HOUR FROM CAST(rdt.rDATE AS TIMESTAMP)), ' to ', EXTRACT(HOUR FROM CAST(rdt.rDATE AS TIMESTAMP)) + 1) AS hourPeriod, -- 总请求数除以每小时15秒间隔数(240),保留两位小数 ROUND(COUNT(*) / 240, 2) AS "requests in interval count" FROM PersonTable pt JOIN TypeToPersonTable ttp ON pt.ID = ttp.PersonID JOIN RequestDateTable rdt ON rdt.SPECID = ttp.SPECID -- 过滤无法转换为带时分秒TIMESTAMP的无效数据 WHERE CAST(rdt.rDATE AS TIMESTAMP) IS NOT NULL GROUP BY pt.Person, EXTRACT(HOUR FROM CAST(rdt.rDATE AS TIMESTAMP)) ORDER BY pt.Person, hourPeriod;
关键说明
- 小时分组:通过
EXTRACT(HOUR FROM ...)提取请求时间的小时部分,以此作为分组依据,确保同一小时内的请求被聚合 - 小时格式:用
CONCAT拼接成from X to X+1的格式,完全匹配期望结果的展示形式 - 平均值计算:
COUNT(*)统计该小时内的总请求数,除以240(每小时的15秒间隔总数),用ROUND保留两位小数 - 数据校验:添加
WHERE子句过滤无法转换为有效时间戳的异常数据,避免计算错误
注意:如果你的
rDATE字段仅存储日期(无时分秒信息),需要补充时间维度数据才能按小时拆分统计,否则所有请求会被归到同一小时(默认0点),无法得到示例中的多小时结果。
内容的提问来源于stack exchange,提问作者slade
相关产品推荐
相关产品推荐

