22,210
社区成员
发帖
与我相关
我的任务
分享
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
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
IF EXISTS (SELECT 1 FROM SYSOBJECTS WHERE name = 'Test1')
BEGIN
TRUNCATE TABLE Test1
END
ELSE
BEGIN
CREATE TABLE Test1
(
ID INT NOT NULL,
CODE INT NOT NULL,
VALUE INT NOT NULL,
[TIME] DATETIME NOT NULL
)
END
GO
INSERT INTO Test1
SELECT 1,3101,13,'2014-02-21 10:08:06' UNION ALL
SELECT 2,3101,15,'2014-02-21 10:08:41' UNION ALL
SELECT 3,3101,12,'2014-02-21 10:08:48' UNION ALL
SELECT 4,3101,13,'2014-02-21 10:09:08' UNION ALL
SELECT 5,3101,8,'2014-02-21 10:12:57' UNION ALL
SELECT 6,3101,5,'2014-02-21 10:13:33' UNION ALL
SELECT 7,3101,12,'2014-02-21 10:14:48' UNION ALL
SELECT 8,3101,21,'2014-02-21 10:15:21' UNION ALL
SELECT 9,3101,13,'2014-02-21 10:16:08' UNION ALL
SELECT 10,3101,14,'2014-02-21 10:20:55' UNION ALL
SELECT 11,3101,17,'2014-02-21 10:21:22' UNION ALL
SELECT 12,3101,19,'2014-02-21 10:21:33' UNION ALL
SELECT 13,3101,13,'2014-02-21 10:21:58' UNION ALL
SELECT 14,3101,13,'2014-02-21 10:22:08' UNION ALL
SELECT 15,3101,13,'2014-02-21 10:22:22' UNION ALL
SELECT 16,3101,12,'2014-02-21 10:23:01' UNION ALL
SELECT 17,3101,13,'2014-02-21 10:23:12' UNION ALL
SELECT 18,3101,15,'2014-02-21 10:23:22' UNION ALL
SELECT 19,3101,13,'2014-02-21 10:23:45' UNION ALL
SELECT 20,3101,17,'2014-02-21 10:24:08' UNION ALL
SELECT 21,3101,13,'2014-02-21 11:08:06' UNION ALL
SELECT 22,3101,13,'2014-02-21 11:08:41' UNION ALL
SELECT 23,3101,9,'2014-02-21 11:08:44' UNION ALL
SELECT 24,3101,12,'2014-02-21 11:08:49' UNION ALL
SELECT 25,3101,13,'2014-02-21 11:09:08' UNION ALL
SELECT 26,3101,16,'2014-02-21 11:10:01'
GO
WITH T1 AS
(
SELECT CODE,VALUE,TIME,RN = ROW_NUMBER() OVER (ORDER BY [TIME] ASC)
FROM Test1
),
T2 AS
(
SELECT CODE,Value,TIME,RN,RM = ROW_NUMBER() OVER (ORDER BY [TIME] ASC)
FROM T1
WHERE Value > 10
),
T3 AS
(
SELECT CODE,MAX(TIME) AS MAXTIME,MIN(TIME) AS MINTIME,RN-RM AS RN,DATEDIFF(SECOND,MIN(TIME),MAX(TIME)) AS DIFF
FROM T2
WHERE Value > 10
GROUP BY CODE,RN-RM
),
T4 AS
(
SELECT A.CODE,
A.VALUE,
A.TIME,
CASE WHEN A.RN-A.RM-CASE WHEN DATEADD(SECOND,-DIFF + 120,B.MAXTIME) > TIME THEN 100000 ELSE 0 END < 0
THEN A.TIME ELSE MAXTIME END AS MAXTIME,
A.RN-A.RM-CASE WHEN DATEADD(SECOND,-DIFF + 120,B.MAXTIME) > TIME THEN 100000 ELSE 0 END AS Result
FROM T2 AS A INNER JOIN T3 AS B ON A.CODE = B.CODE AND A.RN - A.RM = B.RN AND A.TIME <= B.MAXTIME
)
SELECT ID=ROW_NUMBER() OVER (ORDER BY MIN(TIME)),CODE,MAX(VALUE),MIN(TIME),MAX(MAXTIME)
FROM T4
GROUP BY CODE,Result
/*结果
ID CODE (无列名) (无列名) (无列名)
1 3101 15 2014-02-21 10:08:06.000 2014-02-21 10:09:08.000
2 3101 21 2014-02-21 10:14:48.000 2014-02-21 10:16:08.000
3 3101 19 2014-02-21 10:20:55.000 2014-02-21 11:08:41.000
4 3101 16 2014-02-21 11:08:49.000 2014-02-21 11:10:01.000
*/
根据条数酌情增加100000的值就可以了
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 2014-2-21 10:15:21 33 33 4
9 3101 13 2014-2-21 10:16:08 47 80 4
10 3101 14 2014-2-21 10:20:55 287 0 5
11 3101 17 2014-2-21 10:21:22 27 27 5
12 3101 19 2014-2-21 10:21:33 11 38 5
13 3101 13 2014-2-21 10:21:58 25 63 5
14 3101 13 2014-2-21 10:22:08 10 0 6
15 3101 13 2014-2-21 10:22:22 14 14 6
16 3101 12 2014-2-21 10:23:01 39 53 6
17 3101 13 2014-2-21 10:23:12 11 64 6
18 3101 15 2014-2-21 10:23:22 10 0 7
19 3101 13 2014-2-21 10:23:45 23 23 7
20 3101 17 2014-2-21 10:24:08 23 46 7
21 3101 13 2014-2-21 11:08:06 2638 0 8
22 3101 13 2014-2-21 11:08:41 35 35 8
23 3101 9 2014-2-21 11:08:44 3 0 9
24 3101 12 2014-2-21 11:08:49 5 5 9
25 3101 13 2014-2-21 11:09:08 19 24 9
26 3101 16 2014-2-21 11:10:01 53 77 9
参考VBA代码如下:
Sub Test()
Dim cell As Range
Dim rng As Range
Dim s As Long
Dim g As Long
Set rng = Range("E2:E27")
For Each cell In rng
s = s + Val(cell.Value)
If (Val(cell.Offset(0, -2)) < 10 _
Or Val(cell.Value) >= 60) _
Or cell.Offset(-1, 1) >= 60 Then ' 如果VALUE小于10,或间隔时间大于等于60秒,或连续用时大于等于60秒
s = 0
g = g + 1
End If
cell.Offset(0, 1) = s
cell.Offset(0, 2) = g
Next cell
End Sub
如用SQL来写,则可用游标,参考以上思路,希望对你有帮助。