在GROUP BY中这样写的其中Gran表示粒度TRUNC((COLLECTTIME -to_date('2000-01-01','YYYY-MM-DD')-1/3600)*86400/Gran+1)*Gran/86400+to_date('2000-01-01','YYYY-MM-DD')业务逻辑是这样的
在数据库中,数据的COLLECTTIME为5分钟或者10分钟或者15分钟一条数据,如果为15分钟,这里的粒度Gran就为15×60
现在汇总的效果要做为这样的比如我现在的粒度为15分钟,但是我查询的时候粒度为30分钟,我就需要把两条数据汇总为1条collecttime 2008-7-1 00:00:00 Gran 900
collecttime 2008-7-1 00:15:00 Gran 900collecttime 2008-7-1 00:30:00 Gran 900
collecttime 2008-7-1 00:45:00 Gran 900比如上面这四条数据,我需要汇总为2条,汇总为sum(Gran) 和max(collecttime )本人对ORACLE不了解,请各位大侠给我看看,解释下,看能不能写初更优的sql,谢谢先
在数据库中,数据的COLLECTTIME为5分钟或者10分钟或者15分钟一条数据,如果为15分钟,这里的粒度Gran就为15×60
现在汇总的效果要做为这样的比如我现在的粒度为15分钟,但是我查询的时候粒度为30分钟,我就需要把两条数据汇总为1条collecttime 2008-7-1 00:00:00 Gran 900
collecttime 2008-7-1 00:15:00 Gran 900collecttime 2008-7-1 00:30:00 Gran 900
collecttime 2008-7-1 00:45:00 Gran 900比如上面这四条数据,我需要汇总为2条,汇总为sum(Gran) 和max(collecttime )本人对ORACLE不了解,请各位大侠给我看看,解释下,看能不能写初更优的sql,谢谢先
SQL> SELECT * FROM TT;COLLECTTIME GRAN
----------- ----------
7/1/2008 900
7/1/2008 12 900
7/1/2008 12 900
7/1/2008 12 900
7/1/2008 12 900
7/1/2008 12 9006 rows selectedSQL>
SQL> SELECT SUM(GRAN) "SUM_GRAN", MIN(COLLECTTIME) "MIN_COLLECTTIME"
2 FROM TT T1, (SELECT MIN(COLLECTTIME) "MIN_TIMES" FROM TT) T2
3 GROUP BY DECODE(ROUND((COLLECTTIME - MIN_TIMES) * 24 * 60 / 30),
4 0,
5 1,
6 ROUND((COLLECTTIME - MIN_TIMES) * 24 * 60 / 30)); SUM_GRAN MIN_COLLECTTIME
---------- -----------------
3600 7/1/2008 00:00:00
1800 7/1/2008 12:45:00
SQL> SELECT * FROM TT;COLLECTTIME GRAN
-------------------- ----------
7/1/2008 12:00:00 AM 900
7/1/2008 12:15:00 AM 900
7/1/2008 12:28:00 AM 900
7/1/2008 12:30:00 AM 900
7/1/2008 12:45:00 AM 900
7/1/2008 12:55:00 AM 9006 rows selectedSQL>
SQL> SELECT SUM(GRAN) "SUM_GRAN", MIN(COLLECTTIME) "MIN_COLLECTTIME"
2 FROM TT T1, (SELECT MIN(COLLECTTIME) "MIN_TIMES" FROM TT) T2
3 GROUP BY DECODE(ROUND((COLLECTTIME - MIN_TIMES) * 24 * 60 / 30),
4 0,
5 1,
6 ROUND((COLLECTTIME - MIN_TIMES) * 24 * 60 / 30)); SUM_GRAN MIN_COLLECTTIME
---------- --------------------
3600 7/1/2008 12:00:00 AM
1800 7/1/2008 12:45:00 AM
根据粒度group by的例子:
DROP TABLE t;
CREATE TABLE t(a DATE,b INT);
INSERT INTO T
SELECT SYSDATE + TRUNC(DBMS_RANDOM.VALUE(1, 24*60*5))/1440,
TRUNC(DBMS_RANDOM.VALUE(1, 1400))
FROM DUAL
CONNECT BY ROWNUM <= 100;
SELECT TRUNC(A),
TO_CHAR(A, 'hh24') HH24,
CEIL(TO_NUMBER(TO_CHAR(A, 'mi')) / 15) gran,--根据粒度大小可以修改除数为5,15,30
SUM(B)
FROM T
GROUP BY TRUNC(A),
TO_CHAR(A, 'hh24') ,
CEIL(TO_NUMBER(TO_CHAR(A, 'mi')) / 15)--根据粒度大小可以修改除数为5,15,30
ORDER BY 1, 2, 3;
最好是解释详细些,谢谢
TRUNC((tableName.ENDTIME-to_date('2000-01-01','YYYY-MM-DD')-1/3600)*86400/granularity+1)
*granularity/864000 + to_date('2000-01-01','YYYY-MM-DD')