一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

时间:2022-06-01 13:45:03
表的结构如下:


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


一张表,某个字段值相等时,对其它字段值每两条记录作sum计算楼主,提供测试数据前请先自己试一下,否则如果100个人想帮你,则是这100个人都需要浪费时间。

引用
mysql> 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`)
    -> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ',
PRIMARY KEY(`start_time`,`stop_time`,`moi`)
)' at line 8
mysql>

#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楼 不是已经给你答案了吗?  一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#5


引用 4 楼 acmain_chm 的回复:
#2楼 不是已经给你答案了吗?

错了。是回复1楼。
我还以为发帖那个楼是一楼捏
摁。看到了。谢谢

#6


狼头哥太牛X了。学习了。

#7


狼头哥很是厉害啊

#8


狼头哥,帮忙解释一下

select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

这句中我只看得懂MINUTE()函数

#9


引用 4 楼 acmain_chm 的回复:
#2楼 不是已经给你答案了吗?


狼头哥,帮忙解释一下

select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

这句中我只看得懂MINUTE()函数

#10


建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。

#11


引用 10 楼 acmain_chm 的回复:
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。


狼头哥我好崇拜你

#12


select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

select 
SQL语句的语法,
SQL 5.1参考手册
SELECT用于恢复从一个或多个表中选择的行,并可以加入UNION语句和子查询。请参见13.2.7.2节,“UNION语法
”和13.2.8节,“Subquery语法”。

·         每个select_expr都指示一个您想要恢复的列。


 start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。


减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。

interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。  Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。  
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]

。。。。

这样解释太累了。

#13


引用 12 楼 acmain_chm 的回复:
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

select
SQL语句的语法,

SQL 5.1参考手册SELECT用于恢复从一个或多个表中选择的行,并可以加入UNION语句和子查询。请参见13.2.7.2节,“UNION语法
”和13.2.8节,“Subquery语法”。

· 每个s……

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

#14


引用 10 楼 acmain_chm 的回复:
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。


猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以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 |
+-----------------------------------------+


有没有更好的做法呢?
一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#15


引用
两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。
为什么 不看一下MYSQL的手册? 一张表,某个字段值相等时,对其它字段值每两条记录作sum计算一张表,某个字段值相等时,对其它字段值每两条记录作sum计算


MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html


另外提问时请一次性把问题提完。

#16


再贴一次图片。之前发的竟然屏蔽了

一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#17


一张表,某个字段值相等时,对其它字段值每两条记录作sum计算 又是一个死活不肯看帮助手册的!!!

引用
type 值
 预期的 expr 格式
 
MICROSECOND
 MICROSECONDS
 
SECOND
 SECONDS
 
MINUTE
 MINUTES
 
HOUR
 HOURS
 
DAY
 DAYS
 
WEEK
 WEEKS
 
MONTH
 MONTHS
 
QUARTER
 QUARTERS
 
YEAR
 YEARS
 

#19


引用 15 楼 acmain_chm 的回复:
引用两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。为什么 不看一下MYSQL的手册?


MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html


另外提问时请一次性把问题提完。


谢谢你的回复。有时候问问题时没有想到那么多呢。

今天心情不错。手上的活在狼头哥的提携下终于有了些头绪。上面这张喜感的图片让我顿生愉快。

\(^o^)/~\(^o^)/~

祝狼头哥开心啊!

#1


一张表,某个字段值相等时,对其它字段值每两条记录作sum计算楼主,提供测试数据前请先自己试一下,否则如果100个人想帮你,则是这100个人都需要浪费时间。

引用
mysql> 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`)
    -> );
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near ',
PRIMARY KEY(`start_time`,`stop_time`,`moi`)
)' at line 8
mysql>

#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楼 不是已经给你答案了吗?  一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#5


引用 4 楼 acmain_chm 的回复:
#2楼 不是已经给你答案了吗?

错了。是回复1楼。
我还以为发帖那个楼是一楼捏
摁。看到了。谢谢

#6


狼头哥太牛X了。学习了。

#7


狼头哥很是厉害啊

#8


狼头哥,帮忙解释一下

select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

这句中我只看得懂MINUTE()函数

#9


引用 4 楼 acmain_chm 的回复:
#2楼 不是已经给你答案了吗?


狼头哥,帮忙解释一下

select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

这句中我只看得懂MINUTE()函数

#10


建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。

#11


引用 10 楼 acmain_chm 的回复:
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。


狼头哥我好崇拜你

#12


select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

select 
SQL语句的语法,
SQL 5.1参考手册
SELECT用于恢复从一个或多个表中选择的行,并可以加入UNION语句和子查询。请参见13.2.7.2节,“UNION语法
”和13.2.8节,“Subquery语法”。

·         每个select_expr都指示一个您想要恢复的列。


 start_time
你自己表的字段,这个你应该理解了,否则我也没办法解释得再细了。


减号,做四则运算中的减法运算。 很详细的解释见 小学数学第一册第三章。

interval
表示后是一个时间间隔
[Quote=SQL 5.1参考手册]INTERVAL expr type
expr 是一个表达式,用来指定从起始日期添加或减去的时间间隔值。  Expr是一个字符串;对于负值的时间间隔,它可以以一个 ‘-’开头。 type 为关键词,它指示了表达式被解释的方式。  
关键词INTERVA及 type 分类符均不区分大小写。[/Quote]

。。。。

这样解释太累了。

#13


引用 12 楼 acmain_chm 的回复:
select start_time-interval MINUTE(start_time)%30 MINUTE as start_time

select
SQL语句的语法,

SQL 5.1参考手册SELECT用于恢复从一个或多个表中选择的行,并可以加入UNION语句和子查询。请参见13.2.7.2节,“UNION语法
”和13.2.8节,“Subquery语法”。

· 每个s……

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

#14


引用 10 楼 acmain_chm 的回复:
建议你先自己试着解释一下,否则别人也根本不知道你目前已经懂了什么,到什么层次,到底是哪儿不懂。

写出你自己的理解,然后让别人来看你的理解是否正确。 否则别人解释过简单你还是理解不了,解释得过细,可能又是根本不必要。


猴头哥,两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。我的想法是两个数据转换成时间戳求其差,再除以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 |
+-----------------------------------------+


有没有更好的做法呢?
一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#15


引用
两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。
为什么 不看一下MYSQL的手册? 一张表,某个字段值相等时,对其它字段值每两条记录作sum计算一张表,某个字段值相等时,对其它字段值每两条记录作sum计算


MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html


另外提问时请一次性把问题提完。

#16


再贴一次图片。之前发的竟然屏蔽了

一张表,某个字段值相等时,对其它字段值每两条记录作sum计算

#17


一张表,某个字段值相等时,对其它字段值每两条记录作sum计算 又是一个死活不肯看帮助手册的!!!

引用
type 值
 预期的 expr 格式
 
MICROSECOND
 MICROSECONDS
 
SECOND
 SECONDS
 
MINUTE
 MINUTES
 
HOUR
 HOURS
 
DAY
 DAYS
 
WEEK
 WEEKS
 
MONTH
 MONTHS
 
QUARTER
 QUARTERS
 
YEAR
 YEARS
 

#18


#19


引用 15 楼 acmain_chm 的回复:
引用两个表示时间的数据求分钟间隔,时间是年月日时分,没有秒和更小的时间单位。为什么 不看一下MYSQL的手册?


MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html


另外提问时请一次性把问题提完。


谢谢你的回复。有时候问问题时没有想到那么多呢。

今天心情不错。手上的活在狼头哥的提携下终于有了些头绪。上面这张喜感的图片让我顿生愉快。

\(^o^)/~\(^o^)/~

祝狼头哥开心啊!

#20