22,209
社区成员
发帖
与我相关
我的任务
分享
USE tempdb
GO
create table T ([date] datetime,[time] datetime,a int ,b int ,c int ,d int)
insert into T select '2016/1/21','2016/1/21 14:45:21',7,6,1,2
insert into T select '2016/1/21','2016/1/21 14:48:18',7,6,1,0
insert into T select '2016/1/21','2016/1/21 14:48:42',7,6,1,1
insert into T select '2016/1/21','2016/1/21 14:48:58',7,6,1,0
insert into T select '2016/1/21','2016/1/21 14:55:10',7,6,1,1
insert into T select '2016/1/21','2016/1/21 14:55:30',7,6,1,0
insert into T select '2016/1/21','2016/1/21 14:45:22',7,6,2,0
insert into T select '2016/1/21','2016/1/21 14:48:18',7,6,2,1
insert into T select '2016/1/21','2016/1/21 14:48:26',7,6,2,0
insert into T select '2016/1/21','2016/1/21 14:48:38',7,6,2,2
insert into T select '2016/1/21','2016/1/21 14:48:58',7,6,2,0
insert into T select '2016/1/21','2016/1/21 14:55:06',7,6,2,2
insert into T select '2016/1/21','2016/1/21 14:55:30',7,6,2,0
insert into T select '2016/1/21','2016/1/21 15:12:55',7,6,2,1
insert into T select '2016/1/21','2016/1/21 14:45:22',7,6,3,1
insert into T select '2016/1/21','2016/1/21 14:47:50',7,6,3,0
insert into T select '2016/1/21','2016/1/21 14:48:42',7,6,3,2
GO
;WITH Cte
AS
(
SELECT *,Ord=ROW_NUMBER()OVER(PARTITION BY date,a,b,c ORDER BY date,time) FROM T
)
SELECT a.date
,a.a
,a.b
,a.c
,max(CASE WHEN a.d=1 THEN a.d END) AS d1
,MAX(CASE WHEN a.d=1 THEN CONVERT(VARCHAR(8),a.time,8) END) t1
,max(CASE WHEN a.d=2 THEN a.d END) AS d2
,MAX(CASE WHEN a.d=2 THEN CONVERT(VARCHAR(8),a.time,8) END) t2
,max(CASE WHEN a.d=0 THEN a.d END) AS d3
,RIGHT(100+DATEDIFF(ss,MIN(a.time),MAX(a.time))/360,2)+':' +RIGHT(100+DATEDIFF(ss,MIN(a.time),MAX(a.time))%360/60,2)+':'++RIGHT(101+DATEDIFF(ss,MIN(a.time),MAX(a.time))%60,2) t3
FROM Cte AS a
LEFT JOIN Cte AS b ON b.a = a.a
AND b.b = a.b
AND b.c = a.c
AND b.d = 0
AND b.Ord >= a.Ord
AND b.Ord = ( SELECT MIN(Ord)
FROM Cte
WHERE a = a.a
AND b = a.b
AND c = a.c
AND d = 0
AND Ord >= a.Ord
)
GROUP BY a.date
,a.a
,a.b
,a.c
,b.Ord;
GO
/*
date a b c d1 t1 d2 t2 d3 t3
2016-01-21 00:00:00.000 7 6 1 NULL NULL 2 14:45:21 0 00:02:58
2016-01-21 00:00:00.000 7 6 1 1 14:48:42 NULL NULL 0 00:00:17
2016-01-21 00:00:00.000 7 6 1 1 14:55:10 NULL NULL 0 00:00:21
2016-01-21 00:00:00.000 7 6 2 1 15:12:55 NULL NULL NULL 00:00:01
2016-01-21 00:00:00.000 7 6 2 NULL NULL NULL NULL 0 00:00:01
2016-01-21 00:00:00.000 7 6 2 1 14:48:18 NULL NULL 0 00:00:09
2016-01-21 00:00:00.000 7 6 2 NULL NULL 2 14:48:38 0 00:00:21
2016-01-21 00:00:00.000 7 6 2 NULL NULL 2 14:55:06 0 00:00:25
2016-01-21 00:00:00.000 7 6 3 NULL NULL 2 14:48:42 NULL 00:00:01
2016-01-21 00:00:00.000 7 6 3 1 14:45:22 NULL NULL 0 00:02:29
*/
with cte as
(
select *, row_number() over (order by a, b, c) as rowid
from [T]
)
select d.* from (
select a.a, a.b, a.c, a.d as d1, a.time as time1, b.d as d2, b.time as time2, c.d as d3, c.time as time3, a.rowid from cte a
inner join cte b on a.rowid + 1 = b.rowid and a.d = 2 and b.d = 1
inner join cte c on a.rowid + 2 = c.rowid and a.d = 2 and c.d = 0
union all
select a.a, a.b, a.c, a.d, a.time, null, null, b.d, b.time, a.rowid from cte a
inner join cte b on a.rowid + 1 = b.rowid and a.d = 2 and b.d = 0
union all
select a.a, a.b, a.c, null, null, a.d, a.time, b.d, b.time, a.rowid from cte a
inner join cte b on a.rowid + 1 = b.rowid and a.d = 1 and b.d = 0
inner join cte c on a.rowid - 1 = c.rowid and a.d = 1 and c.d != 2) d
order by d.a, d.b, d.c, d.rowid
;WITH Cte
AS
(
SELECT *,Ord=ROW_NUMBER()OVER(PARTITION BY date,a,b,c ORDER BY date,time) FROM T
)
SELECT a.date
,a.a
,a.b
,a.c
,max(CASE WHEN a.d=1 THEN a.d END) AS d1
,MAX(CASE WHEN a.d=1 THEN CONVERT(VARCHAR(8),a.time,8) END) t1
,max(CASE WHEN a.d=2 THEN a.d END) AS d2
,MAX(CASE WHEN a.d=2 THEN CONVERT(VARCHAR(8),a.time,8) END) t2
,max(CASE WHEN a.d=0 THEN a.d END) AS d3
,RIGHT(100+DATEDIFF(ss,MIN(a.time),MAX(a.time))/360,2)+':' +RIGHT(100+DATEDIFF(ss,MIN(a.time),MAX(a.time))%360/60,2)+':'++RIGHT(101+DATEDIFF(ss,MIN(a.time),MAX(a.time))%60,2) t3
FROM Cte AS a
LEFT JOIN Cte AS b ON b.a = a.a
AND b.b = a.b
AND b.c = a.c
AND b.d = 0
AND b.Ord >= a.Ord
AND b.Ord = ( SELECT MIN(Ord)
FROM Cte
WHERE a = a.a
AND b = a.b
AND c = a.c
AND d = 0
AND Ord >= a.Ord
)
GROUP BY a.date
,a.a
,a.b
,a.c
,b.Ord;
/*
date a b c d1 t1 d2 t2 d3 t3
2016-01-21 00:00:00.000 7 6 1 NULL NULL 2 14:45:21 0 00:02:58
2016-01-21 00:00:00.000 7 6 1 1 14:48:42 NULL NULL 0 00:00:17
2016-01-21 00:00:00.000 7 6 1 1 14:55:10 NULL NULL 0 00:00:21
2016-01-21 00:00:00.000 7 6 2 1 15:12:55 NULL NULL NULL 00:00:01
2016-01-21 00:00:00.000 7 6 2 NULL NULL NULL NULL 0 00:00:01
2016-01-21 00:00:00.000 7 6 2 1 14:48:18 NULL NULL 0 00:00:09
2016-01-21 00:00:00.000 7 6 2 NULL NULL 2 14:48:38 0 00:00:21
2016-01-21 00:00:00.000 7 6 2 NULL NULL 2 14:55:06 0 00:00:25
2016-01-21 00:00:00.000 7 6 3 NULL NULL 2 14:48:42 NULL 00:00:01
2016-01-21 00:00:00.000 7 6 3 1 14:45:22 NULL NULL 0 00:02:29
*/