You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;

关键说明

  1. 小时分组:通过EXTRACT(HOUR FROM ...)提取请求时间的小时部分,以此作为分组依据,确保同一小时内的请求被聚合
  2. 小时格式:用CONCAT拼接成from X to X+1的格式,完全匹配期望结果的展示形式
  3. 平均值计算:COUNT(*)统计该小时内的总请求数,除以240(每小时的15秒间隔总数),用ROUND保留两位小数
  4. 数据校验:添加WHERE子句过滤无法转换为有效时间戳的异常数据,避免计算错误

注意:如果你的rDATE字段仅存储日期(无时分秒信息),需要补充时间维度数据才能按小时拆分统计,否则所有请求会被归到同一小时(默认0点),无法得到示例中的多小时结果。

内容的提问来源于stack exchange,提问作者slade

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:52:59