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到另外一张表。这一步简单。
我能想到的思路是上面这样子。不知道可行不可行。
望小牛大牛老牛都来指点迷津!谢谢大家
19 个解决方案
#1
楼主,提供测试数据前请先自己试一下,否则如果100个人想帮你,则是这100个人都需要浪费时间。
#2
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
mysql> 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>
#3
回复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`)
);
#4
#2楼 不是已经给你答案了吗?
#5
错了。是回复1楼。
我还以为发帖那个楼是一楼捏
摁。看到了。谢谢
#6
狼头哥太牛X了。学习了。
#7
狼头哥很是厉害啊
#8
狼头哥,帮忙解释一下
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
#9
狼头哥,帮忙解释一下
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
#10
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。
写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
#11
狼头哥我好崇拜你
#12
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
select
SQL语句的语法,
start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。
-
减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。
interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]
。。。。
这样解释太累了。
select
SQL语句的语法,
start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。
-
减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。
interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]
。。。。
这样解释太累了。
#13
懂了。刚开始就是很迷糊start_time-interval 后面跟两串是怎么回事。
#14
猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以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 |
+-----------------------------------------+
有没有更好的做法呢?
#16
再贴一次图片。之前发的竟然屏蔽了
#17
又是一个死活不肯看帮助手册的!!!
#18
当您的问题得到解答后请及时结贴.
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.html
8、如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖
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.html
8、如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖
#19
谢谢你的回复。有时候问问题时没有想到那么多呢。
今天心情不错。手上的活在狼头哥的提携下终于有了些头绪。上面这张喜感的图片让我顿生愉快。
\(^o^)/~\(^o^)/~
祝狼头哥开心啊!
#20
#1
楼主,提供测试数据前请先自己试一下,否则如果100个人想帮你,则是这100个人都需要浪费时间。
#2
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
mysql> 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>
#3
回复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`)
);
#4
#2楼 不是已经给你答案了吗?
#5
错了。是回复1楼。
我还以为发帖那个楼是一楼捏
摁。看到了。谢谢
#6
狼头哥太牛X了。学习了。
#7
狼头哥很是厉害啊
#8
狼头哥,帮忙解释一下
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
#9
狼头哥,帮忙解释一下
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
这句中我只看得懂MINUTE()函数
#10
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。
写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。
#11
狼头哥我好崇拜你
#12
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time
select
SQL语句的语法,
start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。
-
减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。
interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]
。。。。
这样解释太累了。
select
SQL语句的语法,
start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。
-
减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。
interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。 Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]
。。。。
这样解释太累了。
#13
懂了。刚开始就是很迷糊start_time-interval 后面跟两串是怎么回事。
#14
猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以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 |
+-----------------------------------------+
有没有更好的做法呢?
#15
#16
再贴一次图片。之前发的竟然屏蔽了
#17
又是一个死活不肯看帮助手册的!!!
#18
当您的问题得到解答后请及时结贴.
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.html
8、如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖
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.html
8、如何给分和结贴?
http://community.csdn.net/Help/HelpCenter.htm#结帖
#19
谢谢你的回复。有时候问问题时没有想到那么多呢。
今天心情不错。手上的活在狼头哥的提携下终于有了些头绪。上面这张喜感的图片让我顿生愉快。
\(^o^)/~\(^o^)/~
祝狼头哥开心啊!