2016-10-13 7 views
0

を持つためには、私は以下の表を持っています:グループと追加の例外

Select [Event] 
    ,[Start] 
    ,[End] 
    ,[Tag] 
    ,[Tag_new] = case when Tag='Big' and 'Small' = Lead(Tag,1,Tag) over (Partition By Event Order By Start) then 'Small' else tag end 
    From @YourTable 

    Event           Start   End    Tag Tag_new 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:44 9-9-16 10:49 Big Small 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:50 9-9-16 10:51 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 12:51 4-4-16 13:58 Big Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:04 4-4-16 14:29 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:51 4-4-16 14:58 Big Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:04 4-4-16 15:29 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:45 4-4-16 15:55 Big Big 
    11PIC41010.PV 11-PSV-401002W 11-PSV-401002D 4-4-16 16:04 4-4-16 16:45 Big Big 

が、以下のシーケンスがTag_new列はタグ欄に次の大きなまで、ビッグから始まる「Small2」である必要があり、グループ内のタグの列に表示されたときに私は1つの以上の例外を適用する必要があります。

Small 
    Big 
    Small 

と私が手を下回る結果としたいと思います:iamdaveする

Event           Start   End    Tag Tag_new 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:44 9-9-16 10:49 Big Small 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:50 9-9-16 10:51 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 12:51 4-4-16 13:58 Big Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:04 4-4-16 14:29 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:51 4-4-16 14:58 Big Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:04 4-4-16 15:29 Small Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:45 4-4-16 15:55 Big Big 
    11PIC41010.PV 11-PSV-401002W 11-PSV-401002D 4-4-16 16:04 4-4-16 16:45 Big Big 

アップデート:

私は大きな後にさらにいくつかの小さなを持って

が、それはビッグだけの小さなしばらくはそうSmall2必要があります後に第2小なりますそれは次のビッグまでSmall2する必要があります:

Declare @YourTable table ([Event] varchar(100),[Start] DateTime,[End] DateTime, [Tag] varchar(25)) 
Insert Into @YourTable values 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44','9/9/16 10:49','Big'), 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:50','9/9/16 10:51','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 12:51','4/4/16 13:58','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:04','4/4/16 14:29','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:51','4/4/16 14:58','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:04','4/4/16 15:29','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:30','4/4/16 15:32','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 15:45','4-4-16 15:55','Big'), 
('11PIC41010.PV 11-PSV-401002W 11-PSV-401002D','4/4/16 16:04','4/4/16 16:45','Big') 

そしてここでは、ビッグ後場合の出力数より小さく、 10

Event           Start   End    Tag Tag_new 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:44 9-9-16 10:49 Big Small 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:50 9-9-16 10:51 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 12:51 4-4-16 13:58 Big Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:04 4-4-16 14:29 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:51 4-4-16 14:58 Big Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:04 4-4-16 15:29 Small Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:30 4-4-16 15:32 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:45 4-4-16 15:55 Big Big 
    11PIC41010.PV 11-PSV-401002W 11-PSV-401002D 4-4-16 16:04 4-4-16 16:45 Big Big 

、それは以下のようにする必要があります:

Event           Start   End    Tag Tag_new 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:44 9-9-16 10:49 Big Small 
    10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 9-9-16 10:50 9-9-16 10:51 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 12:51 4-4-16 13:58 Big Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:04 4-4-16 14:29 Small Small 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 14:51 4-4-16 14:58 Big Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:04 4-4-16 15:29 Small Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:30 4-4-16 15:32 Small Small2 
    11PIC41010.PV 11-PSV-401002A 11-PSV-401002B 4-4-16 15:45 4-4-16 15:55 Big Big 
    11PIC41010.PV 11-PSV-401002W 11-PSV-401002D 4-4-16 16:04 4-4-16 16:45 Big Big 

アップデート@iamdave:私はその下にいくつかのシーケンスを持っている場合small2を与えるので、この混乱のために再び 申し訳ありませんが、それはsmall2に変化するようでは、間違った方向でした

Small 
Big 
Small 
Small 
Big 
Small 

これは私が得るものです::すべてのしばらくの間、私はそれらを分離するために探していた

         Event Start     End      Tag Tag_new 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:05.000 2016-09-09 10:48:08.000 Big Big 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:44:10.000 2016-09-09 10:49:40.000 Big Small 
10PIC700422.PV 10-PSV-700073A 10-PSV-700073B 2016-09-09 10:50:03.000 2016-09-09 10:51:04.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 12:51:07.000 2016-04-04 13:58:09.000 Big Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:04:04.000 2016-04-04 14:29:00.000 Small Small 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 14:51:02.000 2016-04-04 14:58:00.000 Big Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:04:06.000 2016-04-04 15:29:08.000 Small Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 15:45:08.000 2016-04-04 15:55:09.000 Big Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:22:08.000 2016-04-04 16:40:09.000 Small Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 16:50:04.000 2016-04-04 16:55:00.000 Small Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:05:02.000 2016-04-04 17:20:00.000 Big Small2 
11PIC41010.PV 11-PSV-401002A 11-PSV-401002B  2016-04-04 17:22:06.000 2016-04-04 17:29:08.000 Small Small2 
11PIC41010.PV 11-PSV-401002W 11-PSV-401002D  2016-04-04 16:04:01.000 2016-04-04 16:45:00.000 Big Big 

ので、最善の解決策は、私は私の最近の問題で説明したように、追加の行を追加し、次のようになります。支援のため事前に

おかげで、 S

+0

あなたがより明確にここにビジネスルールを説明することができます。私には全く意味がありません。そして、あなたは "次へ"を定義する必要があります。次のコンセプトは注文が必要です。このデータの注文の基準は何ですか?イベント、始まるかもしれない? –

+0

Sean、Criteriaは - イベント別のグループとスタート順のグループ –

+0

最初のビジネスルール(上記のクエリで既に定義されています)は、イベント別とスタート順のグループ化、小さいものが大きくなるたびに大きなものから小さなものに変更します。第2のもの:シーケンス時に別のグループを定義する - 小さなビッグ・スモールがタグに表示され、ビッグが次のビッグ・スタートまでのグループの開始点です。それが役に立てば幸い。 –

答えて

0

これはかなり醜いですが、私はそれは何が必要ないと思いますそれは?

あなたの更新に応じて
Declare @YourTable table ([Event] varchar(100),[Start] DateTime,[End] DateTime, [Tag] varchar(25)) 
Insert Into @YourTable values 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44','9/9/16 10:48','Big'), 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44','9/9/16 10:49','Big'), 
('10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:50','9/9/16 10:51','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 12:51','4/4/16 13:58','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:04','4/4/16 14:29','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:51','4/4/16 14:58','Big'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:04','4/4/16 15:29','Small'), 
('11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 15:45','4-4-16 15:55','Big'), 
('11PIC41010.PV 11-PSV-401002W 11-PSV-401002D','4/4/16 16:04','4/4/16 16:45','Big'); 


Select [Event] 
    ,[Start] 
    ,[End] 
    ,[Tag] 
    ,[Tag_new] = case when Tag = 'Big' 
            and Lead(Tag,1,'') over (Partition By Event 
                  Order By Start 
                  ) 
            = 'Small' 
           then 'Small' 
           else tag 
           end 

    ,[Tag_new2] = case when (Tag = 'Big' 
          and lag(Tag,1,'') over (Partition By Event 
                 Order By Start 
                 ) 
           = 'Small' 
          and Lead(Tag,1,'') over (Partition By Event 
                 Order By Start 
                 ) 
           = 'Small' 
         ) 

         or (Tag = 'Small' 
          and lag(Tag,2,'') over (Partition By Event 
                Order By Start 
                ) 
           = 'Small' 
          and lag(Tag,1,'') over (Partition By Event 
                Order By Start 
                ) 
           = 'Big' 
          ) 
        then 'Small2' 
        else case when Tag = 'Big' 
            and Lead(Tag,1,'') over (Partition By Event 
                  Order By Start 
                  ) 
            = 'Small' 
           then 'Small' 
           else tag 
           end 
        end 

    From @YourTable; 

、そしてあなたのステージングテーブルにいくつかの列を追加することができます仮定:

Declare @YourTable table (EventRN int, StartRN int, MaxStartRN int, [Event] varchar(100),[Start] DateTime,[End] DateTime, [Tag] varchar(25), [TagNext] varchar(25)) 
Insert Into @YourTable values 
(null,null,null,'10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:44','9/9/16 10:49','Big',null), 
(null,null,null,'10PIC700422.PV 10-PSV-700073A 10-PSV-700073B','9/9/16 10:50','9/9/16 10:51','Small',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 12:51','4/4/16 13:58','Big',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:04','4/4/16 14:29','Small',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 14:51','4/4/16 14:58','Big',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:04','4/4/16 15:29','Small',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4/4/16 15:30','4/4/16 15:32','Small',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002A 11-PSV-401002B','4-4-16 15:45','4-4-16 15:55','Big',null), 
(null,null,null,'11PIC41010.PV 11-PSV-401002W 11-PSV-401002D','4/4/16 16:04','4/4/16 16:45','Big',null); 


update t 
set EventRN = tt.EventRN 
    ,StartRN = tt.StartRN 
    ,MaxStartRN = tt.MaxStartRN 
    ,TagNext = tt.TagNext 
from @YourTable t 
    inner join (
       select dense_rank() over (order by Event 
             ) as EventRN 
        ,row_number() over (partition by Event 
             order by Start 
             ) as StartRN 
        ,count(1) over (partition by Event) as MaxStartRN 
        ,[Event] 
        ,[Start] 
        ,[End] 
        ,[Tag] 
        ,lead(Tag,1,null) over (partition by Event 
                 order by Start 
                 ) 
         as TagNext 
       from @YourTable 
      ) tt 
     on(t.[Event] = tt.[Event] 
      and t.[Start] = tt.[Start] 
      and t.[End] = tt.[End] 
      and t.Tag = tt.Tag 
      ); 

with cte as 
(
    select EventRN 
     ,StartRN 
     ,MaxStartRN 
     ,[Event] 
     ,[Start] 
     ,[End] 
     ,Tag 
     ,TagNext 
     ,cast(null as varchar(25)) as TagPrev 

     ,case when TagNext = 'Small' 
         then TagNext 
         else Tag 
         end as TagNew 
    from @YourTable 
    where EventRN = 1 
     and StartRN = 1 

    union all 

    select t.EventRN 
     ,t.StartRN 
     ,t.MaxStartRN 
     ,t.[Event] 
     ,t.[Start] 
     ,t.[End] 
     ,t.Tag 
     ,t.TagNext 
     ,case when t.EventRN = c.EventRN then c.Tag else null end as TagPrev 

     ,case when t.EventRN = c.EventRN and c.Tag = 'Small' and t.Tag = 'Big' and t.TagNext = 'Small' 
       or t.EventRN = c.EventRN and c.TagNew = 'Small2' and t.Tag = 'Small' 
      then 'Small2' 
      else case when t.TagNext = 'Small' 
         then t.TagNext 
         else t.Tag 
         end 
      end 
    from cte c 
     inner join @YourTable t 
      on((c.StartRN < c.MaxStartRN 
       and t.EventRN = c.EventRN 
       and t.StartRN = c.StartRN+1 
       ) 
       or (c.StartRN = c.MaxStartRN 
        and t.EventRN = c.EventRN+1 
        and t.StartRN = 1 
        ) 
       ) 
) 
select [Event] 
     ,[Start] 
     ,[End] 
     ,Tag 
     ,TagNew 
from cte 
order by Event 
     ,Start; 
+0

iamdave、ありがとうコードのために、私は現在SQL Serverをテストする必要はありませんが、同じ結果を返すとすぐに問題ありません。あなたたちは、そのような仕事をしている人々を助ける素晴らしい仕事をしています。 –

+0

@JoeGreen心配する必要はありません。私はそれがどのように行くのか教えてください – iamdave

+0

iamdave、私はチェックし、大きな後に小さいものが1つしかない場合はうまくいくが、小さいものはそれ以上小さくないと言う。 –

関連する問題