我有一个带有时间戳数据类型的列“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)
对于 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)