数据库表结构如下
CREATE TABLE #TB
(
sbxlh VARCHAR(50),
updatetime DATETIME,
ResultInfo NVARCHAR(50)
)
INSERT INTO #TB
( sbxlh, updatetime, ResultInfo )
VALUES
('GSFT201402250003','2014-04-29 11:11:48.100','认证'),
('GSFT201402250003','2014-04-29 11:26:47.970','离线'),
('GSFT201402250003','2014-04-29 15:22:44.263','认证'),
('GSFT201402250003','2014-04-29 15:32:44.540','其他'),
('GSFT201402250003','2014-04-29 15:42:44.263','认证'),
('GSFT201402250003','2014-04-29 15:52:44.263','认证'),
('GSFT201402250003','2014-04-29 16:07:43.670','待定'),
('GSFT201402250003','2014-04-29 19:27:43.790','离线'),
('GSFT201402250003','2014-04-29 20:07:43.670','认证'),
('GSFT201402250003','2014-04-29 20:27:43.790','离线')
现在想得到如下数据:
sbxlh stime etime
GSFT201402250003 2014-04-29 11:11:48.100 2014-04-29 11:26:47.970
GSFT201402250003 2014-04-29 15:22:44.263 2014-04-29 19:27:43.790
GSFT201402250003 2014-04-29 20:07:43.670 2014-04-29 20:27:43.790
逻辑为stime就是认证时间,etime就是离线时间
但是在认证和离线之间会有若干个状态的记录,有可能是认证、其他等
那么这种情况的认证以第一个认证为stime
------解决思路----------------------
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(PARTITION BY sbxlh ORDER BY updatetime)RN
,ROW_NUMBER()OVER(PARTITION BY sbxlh,ResultInfo ORDER BY updatetime)RN2
,*
FROM #TB
WHERE ResultInfo IN('认证','离线')
)
,CTE1 AS(
SELECT sbxlh,MIN(updatetime)updatetime
,MAX(RN)RN
FROM CTE
WHERE ResultInfo='认证'
GROUP BY sbxlh,RN-RN2
)
SELECT T1.sbxlh,T1.updatetime stime,T2.updatetime etime
FROM CTE1 T1
LEFT JOIN CTE T2 ON T1.sbxlh=T2.sbxlh
AND T1.RN+1=T2.RN AND T2.ResultInfo='离线'