2017-12-04 6 views
0

を新たなスタートを作成し、日時を停止し、他の列に基づいて行を結合:Find start and end dates when one field changesSQL - 私の問題は、この質問にかなり似ている

はしかし、私は私の状況にコードを適応することはできませんされてきました。どんな助けでも大歓迎です。

私は、ID、タイプと呼ばれる変数、および2つのdatetimeフィールド(Startという名前のものとStopという名前のもの)を含むデータを持っています。 http://sqlfiddle.com/#!6/35f43

列の値StartとStopは連続して実行でき、それらのレコードグループをIDとTypeで結合したいと考えています。私が現在持っている問題は、開始日時と開始日時が連続していない場合、IDとタイプを分けておく必要があるということです。

たとえば、SQLFiddleリンクのデータでは、ID '3'には現在、タイプAの5つのレコードと、その間にタイプBのレコードが1つあります。

ID   Start        Stop    Type 
3  2010-03-12 05:10:02.0000000 2010-03-20 12:00:00.0000000 A 
3  2010-03-20 12:00:00.0000000 2010-04-07 09:46:30.0000000 A 
3  2010-04-07 09:46:30.0000000 2010-05-01 08:13:42.0000000 B 
3  2010-05-01 08:13:42.0000000 2010-07-04 09:30:32.0000000 A 
3  2010-07-04 09:30:32.0000000 2010-07-06 11:41:38.0000000 A 
3  2010-07-06 11:41:38.0000000 2010-07-09 12:51:30.0000000 A 

私はとして表示するにはこれが必要:

ID   Start        Stop    Type 
3  2010-03-12 05:10:02.0000000 2010-04-07 09:46:30.0000000 A 
3  2010-04-07 09:46:30.0000000 2010-05-01 08:13:42.0000000 B 
3  2010-05-01 08:13:42.0000000 2010-07-09 12:51:30.0000000 A 

任意のアイデア?

答えて

0

これはそれを行います。

SELECT 
    ID 
    , Start 
    , [Stop] 
    , [Type] 
FROM 
    (
     SELECT 
      ID 
      , MIN(Start) Start 
      , MAX([Stop]) [Stop] 
      , [Type] 
      , [Region] 
     FROM 
      (
       SELECT 
        ID 
        , Start 
        , [Stop] 
        , [Type] 
        , SUM([First]) OVER (PARTITION BY ID ORDER BY [Start]) Region 
       FROM 
        (
         SELECT 
          ID 
          , Start 
          , [Stop] 
          , [Type] 
          , 
           CASE 
            WHEN LAG([Type], 1, NULL) OVER (PARTITION BY ID ORDER BY [Start]) = [Type] 
            THEN 0 
            ELSE 1 
           END [First] 
         FROM YourTable 
        ) Q 
      ) Q2 
     GROUP BY 
      ID 
      , [Type] 
      , [Region] 
    ) Q3 
ORDER BY Region 
0
;WITH CTE_T AS (
    select *,ROW_NUMBER() OVER(ORDER BY Start) r 
     from T A 
      where not exists(
       select * from T B 
        WHERE B.ID = A.ID AND B.Start = A.Stop AND B.Type = A.Type 
       ) 
    UNION ALL 
    SELECT B.*,A.R fROM CTE_T A 
     JOIN T B ON A.Start = B.Stop 
      AND B.ID = A.ID AND B.Type = A.Type 
) 

SELECT ID,MIN(Start) [Start],MAX(Stop) [Stop],Type FROM CTE_T 
GROUP BY ID,TYPE,R 
関連する問題