如何在 10 分钟的存储桶中对时间戳进行分组并进行聚合

Leo*_*Leo 0 sql oracle

我有一个带有时间戳数据类型的列“hit_timestamp”的表。下面是一些值。

20-MAR-17 00.00.00.000000000
20-MAR-17 00.03.53.000000000
20-MAR-17 00.01.16.000000000
20-MAR-17 00.07.32.000000000
20-MAR-17 00.18.36.000000000
20-MAR-17 00.16.12.000000000 
Run Code Online (Sandbox Code Playgroud)

我想在 10 分钟内分组

time_bucket        no_of_records
----------          ---------
"000000_000010"     4
"000011_000020"     2
Run Code Online (Sandbox Code Playgroud)

tri*_*cot 5

对于 10 分钟间隔,最简单的方法是获取日期的字符串格式,并删除 2 位数分钟部分第一位数字右侧的任何内容。所以20-03-17 00.18.36会被剥离到20-03-17 00.1. 这将很好地作为分组依据。出于显示目的,您可以添加0.00到它以表示存储桶的下限和9.59上限。

现在将时间戳转换为字符串的函数在不同的数据库引擎中是不同的。

对于 Oracle,它看起来像这样:

select   substr(to_char(dat, 'YY-MM-DD HH24.MI'), 1, 13) || '0.00' bucket_start,
         substr(to_char(dat, 'YY-MM-DD HH24.MI'), 1, 13) || '9.59' bucket_end,
         count(*)
from     mytable
group by substr(to_char(dat, 'YY-MM-DD HH24.MI'), 1, 13)
order by 1
Run Code Online (Sandbox Code Playgroud)

输出:

   BUCKET_START   |    BUCKET_END     | COUNT(*)
------------------+-------------------+---------
17-03-20 00.00.00 | 17-03-20 00.09.59 |    4
17-03-20 00.10.00 | 17-03-20 00.19.59 |    2
Run Code Online (Sandbox Code Playgroud)