sql 状态表 求封闭到开启两条数据
sql 状态表 求关闭到开启两条数据
时间 状态
2015-03-24 09:18:29.000 1
2015-03-24 09:17:59.000 0
2015-03-24 09:17:30.000 1
2015-03-24 09:16:59.000 0
2015-03-24 09:16:29.000 1
2015-03-24 09:16:00.000 0
2015-03-24 09:15:30.000 0
0是关闭 1是开启。如何获取 从关闭到开启的两条数据
显示结果
关闭起始时间 关闭结束时间 关闭时间(秒)
2015-03-24 09:15:30.000 2015-03-24 09:16:29.000 60
2015-03-24 09:16:59.000 2015-03-24 09:17:30.000 30
2015-03-24 09:17:59.000 2015-03-24 09:18:29.000 30
------解决思路----------------------
------解决思路----------------------
CREATE TABLE #ttt
(
stime DATETIME,
STATE INT
)
INSERT INTO #ttt
( stime ,
STATE
)
SELECT '2015-03-24 09:15:30.000',0 UNION ALL
SELECT '2015-03-24 09:16:00.000',0 UNION ALL
SELECT '2015-03-24 09:16:29.000',1 UNION ALL
SELECT '2015-03-24 09:16:59.000',0 UNION ALL
SELECT '2015-03-24 09:17:30.000',1 UNION ALL
SELECT '2015-03-24 09:17:59.000',0 UNION ALL
SELECT '2015-03-24 09:18:29.000',1
SELECT stime,etime,DATEDIFF(SECOND,stime,etime ) ds
FROM
(
SELECT
ISNULL(
(
SELECT top 1 stimeFROM #ttt WHERE stime>(SELECT TOP 1 stime FROM #ttt WHERE STATE=1 AND stime<a.stime ORDER BY stime DESC) AND STATE=0
),
(SELECT TOP 1 stime FROM #ttt WHERE STATE=0 AND stime<a.stime ORDER BY stime)
) stime,a.stime etime
FROM #ttt a
WHERE STATE=1
) a
stime etime ds
2015-03-24 09:15:30.000 2015-03-24 09:16:29.000 59
2015-03-24 09:16:59.000 2015-03-24 09:17:30.000 31
2015-03-24 09:17:59.000 2015-03-24 09:18:29.000 30
时间 状态
2015-03-24 09:18:29.000 1
2015-03-24 09:17:59.000 0
2015-03-24 09:17:30.000 1
2015-03-24 09:16:59.000 0
2015-03-24 09:16:29.000 1
2015-03-24 09:16:00.000 0
2015-03-24 09:15:30.000 0
0是关闭 1是开启。如何获取 从关闭到开启的两条数据
显示结果
关闭起始时间 关闭结束时间 关闭时间(秒)
2015-03-24 09:15:30.000 2015-03-24 09:16:29.000 60
2015-03-24 09:16:59.000 2015-03-24 09:17:30.000 30
2015-03-24 09:17:59.000 2015-03-24 09:18:29.000 30
------解决思路----------------------
;WITH CTE AS(
SELECT 时间,状态
,ROW_NUMBER()OVER(ORDER BY 时间)RN1
,ROW_NUMBER()OVER(PARTITION BY 状态 ORDER BY 时间)RN2
FROM TB
)
,CTE1 AS(
SELECT MIN(时间)时间,状态
,ROW_NUMBER()OVER(ORDER BY MIN(时间))RN
FROM CTE
GROUP BY RN1-RN2,状态
)
SELECT T1.时间 AS [关闭起始时间],T2.时间 AS [关闭结束时间]
,DATEDIFF(SECOND,T1.时间,T2.时间)+1 AS [关闭时间(秒)]
FROM CTE1 T1
JOIN CTE1 T2 ON T1.RN+1=T2.RN
WHERE T1.状态=0
------解决思路----------------------
CREATE TABLE #ttt
(
stime DATETIME,
STATE INT
)
INSERT INTO #ttt
( stime ,
STATE
)
SELECT '2015-03-24 09:15:30.000',0 UNION ALL
SELECT '2015-03-24 09:16:00.000',0 UNION ALL
SELECT '2015-03-24 09:16:29.000',1 UNION ALL
SELECT '2015-03-24 09:16:59.000',0 UNION ALL
SELECT '2015-03-24 09:17:30.000',1 UNION ALL
SELECT '2015-03-24 09:17:59.000',0 UNION ALL
SELECT '2015-03-24 09:18:29.000',1
SELECT stime,etime,DATEDIFF(SECOND,stime,etime ) ds
FROM
(
SELECT
ISNULL(
(
SELECT top 1 stimeFROM #ttt WHERE stime>(SELECT TOP 1 stime FROM #ttt WHERE STATE=1 AND stime<a.stime ORDER BY stime DESC) AND STATE=0
),
(SELECT TOP 1 stime FROM #ttt WHERE STATE=0 AND stime<a.stime ORDER BY stime)
) stime,a.stime etime
FROM #ttt a
WHERE STATE=1
) a
stime etime ds
2015-03-24 09:15:30.000 2015-03-24 09:16:29.000 59
2015-03-24 09:16:59.000 2015-03-24 09:17:30.000 31
2015-03-24 09:17:59.000 2015-03-24 09:18:29.000 30