2016-07-29 13 views
2

問題の解決策を見つけようとしています。グループ化された連続した日付をマージする

私の知る限り、SQL Serverのバージョン(2008r2)はこれを制限する要素ですが、私はそこに解決策があると肯定的です。

次のように私の問題がある:

Aは、顧客ステータス-DateStart-DateEnd-イベントIDの形で潜在的な連続した日付を持つテーブルがあります。

お客様とステータス別に連続した日付をマージする必要があります。ステータスフィールドは、顧客の経路全体で上下に移動できます。

次のようにいくつかの例データは、次のとおり

DECLARE @Tbl TABLE([CustomerID] INT 
       ,[Status] INT 
       ,[DateStart] DATE 
       ,[DateEnd] DATE 
       ,[EventID] INT)     

INSERT INTO @Tbl 
VALUES (1,1,'20160101','20160104',1) 
     ,(1,1,'20160104','20160108',3) 
     ,(1,2,'20160108','20160110',4) 
     ,(1,1,'20160110','20160113',7) 
     ,(1,3,'20160113','20160113',9) 
     ,(1,3,'20160113',NULL,10) 
     ,(2,1,'20160101',NULL,2) 
     ,(3,2,'20160109','20160110',5) 
     ,(3,1,'20160110','20160112',6) 
     ,(3,1,'20160112','20160114',8) 

所望の出力:

Customer | Status | DateStart | DateEnd 
---------+--------+-----------+----------- 
1  | 1  | 2016-01-01| 2016-01-08 
1  | 2  | 2016-01-08| 2016-01-10 
1  | 1  | 2016-01-10| 2016-01-13 
1  | 3  | 2016-01-13| NULL 
2  | 1  | 2016-01-01| NULL 
3  | 2  | 2016-01-09| 2016-01-10 
3  | 1  | 2016-01-10| 2016-01-14 

任意のアイデア/コード大幅に受信されます。

おかげで、

ダン

+0

オーダーしてみてください、あなたは私たちが保存する方法オーダー ? – TheGameiswar

+0

ORDERステートメントで使用できるEventID列を含めるように質問が更新されました –

+0

これをどのように選択しますか?2016-01-13 | NULL? – NEER

答えて

2

同じではありません、あなたの入力テーブル内でこの

DECLARE @Tbl TABLE([CusomerID] INT 
       ,[Status] INT 
       ,[DateStart] DATE 
       ,[DateEnd] DATE 
       ,[EventID] INT)     

INSERT INTO @Tbl 
VALUES (1,1,'20160101','20160104',1) 
     ,(1,1,'20160104','20160108',3) 
     ,(1,2,'20160108','20160110',4) 
     ,(1,1,'20160110','20160113',7) 
     ,(1,3,'20160113','20160113',9) 
     ,(1,3,'20160113',NULL,10) 
     ,(2,1,'20160101',NULL,2) 
     ,(3,2,'20160109','20160110',5) 
     ,(3,1,'20160110','20160112',6) 
     ,(3,1,'20160112','20160114',8) 



;WITH CTE 
AS 
(
    SELECT CusomerID , 
     Status , 
     DateStart , 
     COALESCE(DateEnd, '9999-01-01') AS DateEnd, 
     EventID, 
     ROW_NUMBER() OVER (ORDER BY CusomerID, EventID) RowId, 
     ROW_NUMBER() OVER (PARTITION BY CusomerID, Status ORDER BY EventID) StatusRowId FROM @Tbl 
) 

SELECT 
    A.CusomerID , 
    A.Status , 
    A.DateStart , 
    CASE WHEN A.DateEnd = '9999-01-01' THEN NULL 
    ELSE A.DateEnd END AS DateEnd 
FROM 
(
    SELECT 
     CTE.CusomerID, 
     CTE.Status, 
     MIN(CTE.DateStart) AS DateStart, 
     MAX(CTE.DateEnd) AS DateEnd 
    FROM 
     CTE 
    GROUP BY 
     CTE.CusomerID, 
     CTE.Status, 
     CTE.StatusRowId -CTE.RowId  
) A 
ORDER BY A.CusomerID, A.DateStart 

出力

CusomerID Status  DateStart DateEnd 
----------- ----------- ---------- ---------- 
1   1   2016-01-01 2016-01-08 
1   2   2016-01-08 2016-01-10 
1   1   2016-01-10 2016-01-13 
1   3   2016-01-13 NULL 
2   1   2016-01-01 NULL 
3   2   2016-01-09 2016-01-10 
3   1   2016-01-10 2016-01-14 
+0

ほとんどの作品...顧客1とDateEndsのNULL終了日が見つからない場合は、DateStartsと連続していないようです.. –

+0

私はそれを変更する。 – NEER

+0

ありがとうNEER - 私の持っているよりも近いです! –

関連する問題