我有一个oracle数据库,我需要每隔5分钟对一组数据进行分组。 所以我有一个名为Data的表,它有3个字段
数据表从记录数据的应用程序中填充......
我需要得到以下内容,
基于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格式,我需要它在澳大利亚的日期和时间
由于
答案 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小时之间的任何间隔,在一天内适合整数。