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

Oracle 11按小时分组统计唯一ADDR的SQL查询求助

按小时统计唯一ADDR数量的Oracle查询

要实现按小时分组统计不重复的ADDR数量,核心是结合时间截断/提取和去重计数这两个逻辑,在Oracle 11g里可以这样写:

方式1:仅提取24小时制小时数(适合单日数据)

如果你的数据都是同一天,只需要小时数字作为分组依据,用TO_CHAR提取小时:

SELECT
    TO_CHAR(TIMESTAMP, 'HH24') AS HOUR,
    COUNT(DISTINCT ADDR) AS COUNT
FROM DBTB
GROUP BY TO_CHAR(TIMESTAMP, 'HH24')
ORDER BY HOUR;

这个查询会把同一小时内的重复ADDR只算一次,完美匹配你给出的示例输出:

HOUR | COUNT
17 | 2
18 | 3

方式2:保留完整小时区间(适合跨天数据)

如果你的数据可能跨多天,建议用TRUNC把时间戳截断到小时级别,这样不同日期的同一小时会被分开统计:

SELECT
    TRUNC(TIMESTAMP, 'HH24') AS HOUR_INTERVAL,
    COUNT(DISTINCT ADDR) AS UNIQUE_ADDR_COUNT
FROM DBTB
GROUP BY TRUNC(TIMESTAMP, 'HH24')
ORDER BY HOUR_INTERVAL;

输出会类似:

HOUR_INTERVAL | UNIQUE_ADDR_COUNT
19-OCT-2021 17:00:00 | 2
19-OCT-2021 18:00:00 | 3

关键逻辑说明

  • COUNT(DISTINCT ADDR):确保每个小时内的同一个ADDR只被统计一次,这是实现"唯一数量"的核心。
  • TO_CHAR(TIMESTAMP, 'HH24'):用24小时制提取小时数,避免12小时制的AM/PM混淆问题。
  • TRUNC(TIMESTAMP, 'HH24'):将时间戳截断到当前小时的起始时刻,是Oracle处理时间分组的常用方法,对DATE和TIMESTAMP类型都适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 19:02:28