当前位置: 代码迷 >> Sql Server >> 请问数据合并的有关问题
  详细解决方案

请问数据合并的有关问题

热度:57   发布时间:2016-04-24 09:30:02.0
请教数据合并的问题
数据库表结构如下

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='离线'
  相关解决方案