2017-05-19 5 views
3

以下のデータセットをSQL Serverに返すようにします。私は2列のTrailerPosition &区切りとゾーンを返すことを探している。ゾーンはゾーン1で始まると計算され、その後、ディバイダ= 1の後にレコードのゾーン2に変更されます。次にDivider = 1の次のレコードの次の3に戻ります。以下のスクリーンショットは、 。この列をSQL Serverで取得する方法

これはどのようにSQL Serverで行うことができますか?以下のための

テストデータ:

declare @t table (TrailerPosition nvarchar(5),Divider bit); 
insert into @t values ('01L',0),('01R',0),('02L',0),('02R',1),('03L',1),('03R',0),('04L',0),('04R',0),('05L',1),('05R',1),('06L',0),('06R',0),('07L',0),('07R',0),('08L',0),('08R',0),('09L',0),('09R',0),('10L',0),('10R',0),('11L',0),('11R',0),('12L',0),('12R',0),('13L',0),('13R',0),('14L',0),('14R',0),('15L',0),('15R',0); 

enter image description here

+0

あなたが持っているように見えますdivider = 1の場合のdividerカラムの2つのデータポイント。ただし、divider = 1のときにzoneが変化するという要件があるので、実際にはこれはできません。そうでなければ、一度だけ変更したいときにゾーンが2回変化するクエリを取得します。 –

+1

あなたのデータは画像ではなくテキストとして投稿してください。私たちの側でテストするのがはるかに簡単になります。また、これまでに何を試しましたか? – iamdave

+0

@ JoeStamesの場合、ゾーン値をインクリメントする必要がある場合よりも1の後に0が得られると言います。 0,0,1,1(ゾーン= 1)、0,0,1,1,1,1(ゾーン= 2)、0,0,1,1,1(ゾーン= 3)、0,0、 0、0、0,1(ゾーン= 4)、0 –

答えて

4

2012+場合は、ウィンドウ関数は、素敵なフィット感になり、ここで

Select TrailerPosition 
     ,Divider 
     ,Zone = 1+sum(Flag) over (Order By TrailerPosition) 
From (
     Select * 
       ,Flag = case when Lag(Divider,1) over (Order By TrailerPosition) =1 and Divider=0 then 1 else 0 end 
     From YourTable 
    ) A 

戻り

enter image description here

+1

Yep、Lag、Leadが行く方法です。 – SQLMason

0

そこで、ゾーン= 1 + 0の分周値と更新された1

の分周値を有する前の行と前の行の数

SELECT TrailerPosition, Divider, 
    (SELECT COUNT(*) 
    FROM @MyTable T1 
    WHERE (T1.TrailerPosition <= t0.TrailerPosition) 
     AND (T1.Divider = 0)   
     AND (SELECT Divider 
      FROM @MyTable t2 
      WHERE T2.TrailerPosition = 
       (SELECT MAX(T3.TrailerPosition) 
        FROM @MyTable T3 
        WHERE T3.TrailerPosition < T1.TrailerPosition)) = 1) + 1 
        AS Zone 
FROM @MyTable t0 
関連する問題