如何获取每5分钟分组的数据?

时间:2017-11-01 21:54:11

标签: sql oracle

我有一个oracle数据库,我需要每隔5分钟对一组数据进行分组。 所以我有一个名为Data的表,它有3个字段

  • ID ==>唯一主键
  • 已创建==>日期时间字段
  • 位置==> numeric ==>可以是以下数字之一1,2,3,4

数据表从记录数据的应用程序中填充......

我需要得到以下内容,

  • where子句,指定开始日期和时间以及结束日期和时间

基于where子句,我需要将数据分成5分钟段,并显示有多少位置数。

所以我需要这样的结果,

Date Time              POS  COUNT(1)
31/10/2017 6:00:00 AM   1   7
31/10/2017 6:00:00 AM   2   6
31/10/2017 6:00:00 AM   3   7
31/10/2017 6:05:00 AM   1   4
31/10/2017 6:05:00 AM   2   10
31/10/2017 6:05:00 AM   3   24
31/10/2017 6:10:00 AM   1   6
31/10/2017 6:10:00 AM   2   12
31/10/2017 6:10:00 AM   3   6

感谢任何帮助......它是一个oracle数据库......日期也是GMT格式,我需要它在澳大利亚的日期和时间

由于

2 个答案:

答案 0 :(得分:0)

一种方法是:

select trunc(Created) + (floor(extract(minute from Created) / 5) * 5) / (24*60) as minutes,
       pos, count(*)
from data t
group by trunc(Created) + (floor(extract(minute from Created) / 5) * 5) / (24*60) 
order by minutes;

答案 1 :(得分:0)

我使用这个通用函数:

CREATE FUNCTION IntervalFloor(ts IN TIMESTAMP, roundInterval IN INTERVAL DAY TO SECOND) RETURN TIMESTAMP DETERMINISTIC IS
    denom INTEGER;
BEGIN
    IF roundInterval >= INTERVAL '1' HOUR THEN
        denom := EXTRACT(HOUR FROM roundInterval);
        IF MOD(24, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts) + TRUNC(EXTRACT(HOUR FROM ts) / denom) * denom * INTERVAL '1' HOUR;
    ELSIF roundInterval >= INTERVAL '1' MINUTE THEN
        denom := EXTRACT(MINUTE FROM roundInterval);
        IF MOD(60, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts, 'hh') + TRUNC(EXTRACT(MINUTE FROM ts) / denom) * denom * INTERVAL '1' MINUTE;
    ELSE
        denom := EXTRACT(SECOND FROM roundInterval);                
        IF MOD(60, denom) <> 0 THEN
            RAISE VALUE_ERROR;
        END IF;
        RETURN TRUNC(ts, 'mi') + TRUNC(EXTRACT(SECOND FROM ts) / denom) * denom * INTERVAL '1' SECOND;
    END IF;
END IntervalFloor;

然后你可以像

一样使用它
select IntervalFloor(Created, INTERVAL '5' MINUTE), Position, count(*)
from your_table
group by Position, IntervalFloor(Created, INTERVAL '5' MINUTE);

该函数占用1秒到24小时之间的任何间隔,在一天内适合整数。