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
相关产品推荐
相关产品推荐

