表的结构如下:
DROP TABLE IF EXISTS nbi_north_db.RncFunction_15;
CREATE TABLE nbi_north_db.RncFunction_15(
`start_time` DATETIME,
`stop_time` DATETIME,
`moi` VARCHAR(256),
`RAB.SuccRelCS.Conv` FLOAT,
`IUCSOCT.UPInCs.Conv` FLOAT,
`RLC.CSDlOct.sum` FLOAT,
`IRATHO.FailOutCS.sum` FLOAT,
PRIMARY KEY(`start_time`,`stop_time`,`moi`)
);INSERT INTO nbi_north_db.RncFunction_15(
`start_time`,
`stop_time`,
`moi`,
`RAB.SuccRelCS.Conv`,
`IUCSOCT.UPInCs.Conv`,
`RLC.CSDlOct.sum`,
`IRATHO.FailOutCS.sum`) 
VALUES(
'2010-11-26 10:00:00',
'2010-11-26 10:15:00',
'moi1',
1,2,3,4),
('2010-11-26 10:15:00',
'2010-11-26 10:30:00',
'moi1',
5,6,7,8),
('2010-11-26 10:30:00',
'2010-11-26 10:45:00',
'moi1',
11,12,13,14),
('2010-11-26 10:45:00',
'2010-11-26 11:00:00',
'moi1',
21,22,23,24);需求是这样:
主键是开始时间、结束时间、moi三个字段
start_time和stop_time都是年月日时分秒的格式,时间规律如下(这里是省略了年月日):start_time    stop_time
10:00         10:15
10:15         10:30
10:30         10:45
10:45         11:00就是说结束时间和开始时间间隔是15分钟。而且是给出的这种,00分,15分,30分,45分,这样子。当moi相等时,比较开始时间和结束时间。看上面的时间,如果是moi相等时,把数据统计成间隔30分钟的。假设其它四个字段在统计过程中都是做sum计算。需要的结果如下:
start_time   stop_time  moi   `RAB.SuccRelCS.Conv`  `IUCSOCT.UPInCs.Conv`  `RLC.CSDlOct.sum``IRATHO.FailOutCS.sum`
10:00        10:30      moi1        6                 8                      10               12
10:30        11:00      moi1        32                34                     36               38
我的想法:
用两个游标遍历这一张表。游标嵌套,在循环过程中对比moi字段的值,moi相等时,比较start_time和stop_time是否相等。因为相等时是同一条记录嘛。所以两个时间不相等时,再看start_time和stop_time是否间隔15分钟。而且这里有个问题要提醒一下:统计成间隔30分钟,但不能交叉统计。就是说,10:00---10:30,不会来一个10:15---10:45。也就是说统计后的结果中,start_time分钟数只能是00和30。在这些条件都满足的情况下,将相应的字段作相加计算。
最后统计出的结果insert到另外一张表。这一步简单。
我能想到的思路是上面这样子。不知道可行不可行。
望小牛大牛老牛都来指点迷津!谢谢大家

解决方案 »

  1.   

    select start_time-interval MINUTE(start_time)%30 MINUTE as start_time,
    max(stop_time) as stop_time,
    moi,
    sum(`RAB.SuccRelCS.Conv`) AS `RAB.SuccRelCS.Conv`,
    sum(`IUCSOCT.UPInCs.Conv`) AS `IUCSOCT.UPInCs.Conv`,
    Sum(`RLC.CSDlOct.sum`) as `RLC.CSDlOct.sum`,
    Sum(`IRATHO.FailOutCS.sum`) as `IRATHO.FailOutCS.sum`
    from RncFunction_15
    Group By start_time-interval Minute(start_time)%30 MINUTE,moimysql> select * from RncFunction_15;
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    | start_time          | stop_time           | moi  | RAB.SuccRelCS.Conv | IUCSOCT.UPInCs.Conv | RLC.CSDlOct.sum | IRATHO.FailOutCS.sum |
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    | 2010-11-26 10:00:00 | 2010-11-26 10:15:00 | moi1 |                  1 |            2 |               3 |                    4 |
    | 2010-11-26 10:15:00 | 2010-11-26 10:30:00 | moi1 |                  5 |            6 |               7 |                    8 |
    | 2010-11-26 10:30:00 | 2010-11-26 10:45:00 | moi1 |                 11 |           12 |              13 |                   14 |
    | 2010-11-26 10:45:00 | 2010-11-26 11:00:00 | moi1 |                 21 |           22 |              23 |                   24 |
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    4 rows in set (0.02 sec)mysql> select start_time-interval MINUTE(start_time)%30 MINUTE as start_time,
        ->  max(stop_time) as stop_time,
        ->  moi,
        ->  sum(`RAB.SuccRelCS.Conv`) AS `RAB.SuccRelCS.Conv`,
        ->  sum(`IUCSOCT.UPInCs.Conv`) AS `IUCSOCT.UPInCs.Conv`,
        ->  Sum(`RLC.CSDlOct.sum`) as `RLC.CSDlOct.sum`,
        ->  Sum(`IRATHO.FailOutCS.sum`) as `IRATHO.FailOutCS.sum`
        -> from RncFunction_15
        -> Group By start_time-interval Minute(start_time)%30 MINUTE,moi;
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    | start_time          | stop_time           | moi  | RAB.SuccRelCS.Conv | IUCSOCT.UPInCs.Conv | RLC.CSDlOct.sum | IRATHO.FailOutCS.sum |
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    | 2010-11-26 10:00:00 | 2010-11-26 10:30:00 | moi1 |                  6 |            8 |              10 |                   12 |
    | 2010-11-26 10:30:00 | 2010-11-26 11:00:00 | moi1 |                 32 |           34 |              36 |                   38 |
    +---------------------+---------------------+------+--------------------+---------------------+-----------------+----------------------+
    2 rows in set (0.05 sec)mysql>
      

  2.   

    回复2楼
    摁。发现有一个逗号是中文的,不好意思。重新贴一下。
    DROP TABLE IF EXISTS nbi_north_db.RncFunction_15;
    CREATE TABLE nbi_north_db.RncFunction_15(
    `start_time` DATETIME,
    `stop_time` DATETIME,
    `moi` VARCHAR(256),
    `RAB.SuccRelCS.Conv` FLOAT,
    `IUCSOCT.UPInCs.Conv` FLOAT,
    `RLC.CSDlOct.sum` FLOAT,
    `IRATHO.FailOutCS.sum` FLOAT,
    PRIMARY KEY(`start_time`,`stop_time`,`moi`)
    );
      

  3.   

    狼头哥,帮忙解释一下select start_time-interval MINUTE(start_time)%30 MINUTE as start_time这句中我只看得懂MINUTE()函数
      

  4.   


    狼头哥,帮忙解释一下select start_time-interval MINUTE(start_time)%30 MINUTE as start_time这句中我只看得懂MINUTE()函数
      

  5.   

    select start_time-interval MINUTE(start_time)%30 MINUTE as start_timeselect 
    SQL语句的语法, start_time
    你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。-
    减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。interval
    表示后是一个时间间隔
    [Quote=SQL 5.1参考手册]INTERVAL expr type
    expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。  Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。  
    关键词INTERVA及 type 分类符均不区分大小写。[/Quote]。这样解释太累了。
      

  6.   

    懂了。刚开始就是很迷糊start_time-interval 后面跟两串是怎么回事。
      

  7.   


    猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以60。
    mysql> set @t1='2010-12-31 23:59';
    Query OK, 0 rows affected (0.00 sec)mysql> set @t2='2011-1-1 0:01';
    Query OK, 0 rows affected (0.00 sec)mysql> select unix_timestamp(@t2)-unix_timestamp(@t1);
    +-----------------------------------------+
    | unix_timestamp(@t2)-unix_timestamp(@t1) |
    +-----------------------------------------+
    |                                     120 |
    +-----------------------------------------+
    有没有更好的做法呢?
      

  8.   

    为什么 不看一下MYSQL的手册?
    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
    另外提问时请一次性把问题提完。
      

  9.   

    当您的问题得到解答后请及时结贴.
    http://topic.csdn.net/u/20090501/15/7548d251-aec2-4975-a9bf-ca09a5551ba5.html
    http://topic.csdn.net/u/20100428/09/BC9E0908-F250-42A6-8765-B50A82FE186A.html
    http://topic.csdn.net/u/20100626/09/f35a4763-4b59-49c3-8061-d48fdbc29561.html8、如何给分和结贴?
    http://community.csdn.net/Help/HelpCenter.htm#结帖