表的结构如下:
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到另外一张表。这一步简单。
我能想到的思路是上面这样子。不知道可行不可行。
望小牛大牛老牛都来指点迷津!谢谢大家
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到另外一张表。这一步简单。
我能想到的思路是上面这样子。不知道可行不可行。
望小牛大牛老牛都来指点迷津!谢谢大家
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>
摁。发现有一个逗号是中文的,不好意思。重新贴一下。
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`)
);
狼头哥,帮忙解释一下select start_time-interval MINUTE(start_time)%30 MINUTE as start_time这句中我只看得懂MINUTE()函数
SQL语句的语法, start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。-
减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]。这样解释太累了。
猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以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 |
+-----------------------------------------+
有没有更好的做法呢?
MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html
另外提问时请一次性把问题提完。
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#结帖