在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,谢谢先

解决方案 »

  1.   

    是这个意思吗?
    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
      

  2.   

    数据格式调整了一下:
    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
      

  3.   


    根据粒度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; 
      

  4.   

    请大家帮我解释下这段话是什么意思吧
    最好是解释详细些,谢谢
    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')