日期:2014-05-16  浏览次数:20598 次

再发一帖,求一SQL语句!
有点复杂,也不知道直接SQL语句能不能得出想要的结果.先谢过!如下:
表A 有如下字段
ID	CODE	VALUE	TIME
1 3101 13 2014-02-21 10:08:06
2 3101 15 2014-02-21 10:08:41
3 3101 12 2014-02-21 10:08:48
4 3101 13 2014-02-21 10:09:08
5 3101 8 2014-02-21 10:12:57
6 3101 5 2014-02-21 10:13:33
7 3101 12 2014-02-21 10:14:48
8 3101 21 2014-02-21 10:15:21
9 3101 13 2014-02-21 10:16:08
10 3101 14 2014-02-21 10:20:55
11 3101 17 2014-02-21 10:21:22
12 3101 19 2014-02-21 10:21:33
13 3101 13 2014-02-21 10:21:58
14 3101 13 2014-02-21 10:22:08
15 3101 13 2014-02-21 10:22:22
16 3101 12 2014-02-21 10:23:01
17 3101 13 2014-02-21 10:23:12
18 3101 15 2014-02-21 10:23:22
19 3101 13 2014-02-21 10:23:45
20 3101 17 2014-02-21 10:24:08
21 3101 13 2014-02-21 11:08:06
22 3101 13 2014-02-21 11:08:41
23 3101 9 2014-02-21 11:08:44
24 3101 12 2014-02-21 11:08:49
25 3101 13 2014-02-21 11:09:08
26 3101 16 2014-02-21 11:10:01


表A是一个设备所采集的数据.有设备编号,采集时间和当前的值.

现需要一个统计功能,求出该设备每天连续时间内超标的详情(采集数据值连续60秒及以上时间都超标),包括:
设备号,超标过程中的最大值是多少,什么时候开始超标,什么时候超标结束.

计算方法:
1.如果连续60秒VALUE值都是大于10的则记录为超标统计记录;
2.如果连续60秒VALUE有大于10的但是也有小于10的,只要有小于10的就从下一条大于10的开始重新计算(只要有小于10的就算不超标,则从下一条超标的开始计算是否有连续超标),小于10之前的就忽略;
3.如果下一条记录和上一条记录相差时间超过120秒则重新记录为一条新的超标统计记录.
4.超标统计记录中MAX_VALUE为在此超标时间段内VALUE的最大值.

例如表A的超标统计结果如下:
ID	CODE	MAX_VALUE	BEGINTIME		ENDTIME
1 3101 15 2014-02-21 10:08:06 2014-02-21 10:09:08
2 3101 21 2014-02-21 10:17:48 2014-02-21 10:19:08
3 3101 19 2014-02-21 10:20:55 2014-02-21 10:24:08
4 3101 16 2014-02-21 11:08:49 2014-02-21 11:10:01


a.A表中ID=1-4为连续时间超过60秒VALUE值大于10的记录,生成为一条结果记录.结果表中的ID=1的记录;
b.A表中ID=5,6的为非超标记录,被丢弃,忽略;
c.A表中ID=7-9为连续时间超过60秒VALUE值大于10的记录,生成为一条结果记录.结果表中的ID=2的记录;
d.A表中ID=10与前一条记录相差时间超过120秒,重新开始计算.ID=10-20为连续时间超过60秒及以上时间VALUE值大于10的记录,生成为一条结果记录.结果表中的ID=3的记录;
e.A表中ID=21与前一条记录相差时间超过120秒,重新开始计算,至ID=23时,因为连续超标时间不足60秒,则ID=21,22,23都被丢弃,忽略.
f.A表中ID=24-26为连续时间超过60秒VALUE值大于10的记录,生成为一条结果记录.结果表中的ID=4的记录;


一个设备一天中会有多个超标的统计.
例如CODE是3101的设备今天的统计是超标了15次,以及这15次的超标详情,什么时候超,什么时候结束,超的过程中最大值是多少.

现在发的这一贴和原来问的有所简化,原帖:

http://bbs.csdn.net/topics/390713542
http://bbs.csdn.net/topics/390714220

麻烦大家给点思路,SQL最好,先谢过大家了!
------解决方案--------------------
你这种就只能用游标一条条记录检索了,然后弄个临时表,这个表的字段有:ID    CODE    VALUE    BEGINTIME ENDTIME
把第一条记录放到临时表中,然后时间填到BEGINTIME一栏,继续遍历表A,如果该条记录的时间和临时表中ENDTIME为空的记录的BEGINTIME的时间间隔大于60秒,则把这条记录的时间填到临时表中ENDTIME为空的记录。再将下一条记录放到临时表中,再继续往下找,以此类推。最后就得到你要的结果。
------解决方案--------------------
可以先从第一条记录的时间开始算+60秒 看看是不是大于第二条记录 大于则先看值是不是大于10 如果大于则进行对比value值 保存最大值,
再用第一条记录+60秒和第三条记录比 如果小于第三条时间 大于则先看值是不是大于10 如果大于则进行对比value值 保存最大值 依次类推 使用游标进行操作
------解决方案--------------------
EXCEL表格如下,后面三列为辅助列
(间隔:两次采集时间间隔。用时:连续用时,不符合条件的重新从0开始累加)

ID CODE VALUE TIME              间隔_秒  用时_秒  分组
1 3101 13 2014-2-21 10:08:06 0  0 1
2 3101 15 2014-2-21 10:08:41 35  35 1
3 3101 12 2014-2-21 10:08:48 7  42 1
4 3101 13 2014-2-21 10:09:08 20  62 1
5 3101 8 2014-2-21 10:12:57 229  0 2
6 3101 5 2014-2-21 10:13:33 36  0 3
7 3101 12 2014-2-21 10:14:48 75  0 4
8 3101 21