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

时间:2017-08-21 17:08:48

标签: 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 

我想在10分钟内分组

time_bucket        no_of_records
----------          ---------
"000000_000010"     4
"000011_000020"     2

2 个答案:

答案 0 :(得分:3)

每隔10分钟,最简单的方法是获取日期的字符串格式,并删除2位数分钟部分第一个数字右侧的任何内容。因此,StopWatchLoop<string>(getElementText, myXpath, Content.Text); 将被剥夺至20-03-17 00.18.36。这将成为分组的价值。出于显示目的,您可以向其添加20-03-17 00.1以表示存储桶的下限,并为{> 1>添加0.00

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

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

9.59

输出:

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

答案 1 :(得分:1)

你可以将hti_teimstamp向下舍入到每10分钟的间隔,然后再按一个组进行分组。

  

“2017-03-20 00:03:53.0000000”成为“2017-03-20 00:00:00.000”

     

“2017-03-20 00:18:36.0000000”成为“2017-03-20 00:10:00.000”

select dateadd(minute, datediff(minute, 0, hit_timestamp)/10*10 ,0) as time_bucket, count(1) as no_of_records
from #temp
group by dateadd(minute, datediff(minute, 0, hit_timestamp)/10*10 ,0)