2016-03-29 33 views
0

我不確定這個查詢是否重複,如果是這樣,請根據「已回答」查詢指導我。我不確定什麼可能是適合此查詢的標題。如何:特定的複雜分組查詢

我有我的SQL Server以下數據2008 R2

|Date    |Status  | 
|------------------|------------| 
|29-Mar-2016 07:30 |X   | 
|29-Mar-2016 07:31 |Y   | 
|29-Mar-2016 07:32 |Y   | 
|29-Mar-2016 07:33 |Y   | 
|29-Mar-2016 07:34 |Y   | 
|29-Mar-2016 07:40 |X   | 
|29-Mar-2016 07:43 |Z   | 
|29-Mar-2016 07:45 |Z   | 

結果是什麼,我希望是如下

|Start Date  | End Date   |Status  | 
|------------------|------------------|-----------| 
|29-Mar-2016 07:30 |29-Mar-2016 07:31 |X   | 
|29-Mar-2016 07:31 |29-Mar-2016 07:34 |Y   | 
|29-Mar-2016 07:40 |29-Mar-2016 07:43 |X   | 
|29-Mar-2016 07:43 |29-Mar-2016 07:45 |Z   | 

任何建議對SQL查詢。

+2

它看起來像'間隙和孤島',但所需的邏輯不清楚。爲什麼有時'結束日期'是從與'開始日期'相同的組中取得的,有時是從下一個組中取出的? –

+0

@VladimirBaranov日期以毫秒爲單位。 「Y」的分組數據的最後一行成爲結束日期,並且「X」的分組數據的開始成爲開始日期。 – aioracle

回答

1
DECLARE @TEMP AS TABLE(
    [Date] DATETIME, 
    [Status] VARCHAR 
) 

INSERT INTO @TEMP VALUES('29.03.2016 07:30','X') 
INSERT INTO @TEMP VALUES('29.03.2016 07:31','Y') 
INSERT INTO @TEMP VALUES('29.03.2016 07:32','Y') 
INSERT INTO @TEMP VALUES('29.03.2016 07:33','Y') 
INSERT INTO @TEMP VALUES('29.03.2016 07:34','Y') 
INSERT INTO @TEMP VALUES('29.03.2016 07:40','X') 
INSERT INTO @TEMP VALUES('29.03.2016 07:43','Z') 
INSERT INTO @TEMP VALUES('29.03.2016 07:45','Z') 

SELECT * FROM @TEMP 

;WITH TEMP(n,d,s) 
AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY [Date]),[Date],[Status] 
    FROM @TEMP 
), StatePeriods(n,T_n,T_d,T_s,TL_n,TL_d,TL_s,TR_n,TR_d,TR_s) 
AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY T.d),T.n,T.d,T.s,TL.n,TL.d,TL.s,TR.n,TR.d,TR.s 
    FROM TEMP AS T 
    LEFT JOIN TEMP AS TR ON T.n = TR.n-1 
    LEFT JOIN TEMP AS TL ON T.n-1 = TL.n 
    WHERE T.s <> TR.s OR T.s <> TL.s OR TR.s IS NULL OR TL.s IS NULL 
) 
SELECT SP1.T_n,SP1.T_d,SP1.T_s,SP1.TL_d,SP1.TL_s,CASE WHEN SP1.T_s = SP3.T_s THEN SP3.TR_d ELSE SP3.T_d END 
FROM StatePeriods AS SP1 
LEFT JOIN StatePeriods AS SP2 ON SP1.n-1 = SP2.n 
LEFT JOIN StatePeriods AS SP3 ON SP1.n+1 = SP3.n 
WHERE NOT (SP1.T_s=SP2.T_s AND SP1.TL_s IS NOT NULL AND SP1.TR_s IS NOT NULL) 

而且你可以過濾第一或最後一排

這是一個非常耗費資源的解決方案。但你可以使用臨時表而不是'WITH'

+0

感謝您使用此解決方案。像魅力一樣工作!我也爲這個查詢添加了timediff。如何對此進行後續查詢將盡快發佈。 – aioracle