2016-07-21 5 views
2

私の問題をセットベースで解決するために1 1/2シフトを試みましたが、そこにはかなり到達できませんでした。カーソルで約15分でそれを解決し、それは十分に速く実行されます。 しかし、それはセットベースの方法があるのだろうかと思います。不連続シーケンスの最初のレコードを特定するTSQL

私たちは、第三者のHRアプリケーションから抽出された従業員ステータス変更の記録を持っています:empid、recorddate、status。時間の経過とともにempの状態が変化するたびに記録とステータスを特定する必要があります。しかし、データに問題があります。 empの記録日が異なる行がある場合もありますが、ステータスは変更されません。

declare @test table (empid int, recorddate date,status varchar(10)) 
insert into @test (empid,recorddate,status) values 
(1,'1/1/2000','a'), 
(1,'2/1/2000','b'), 
(1,'3/1/2000','b'), 
(1,'3/3/2000','b'), 
(1,'4/1/2000','c'), 
(2,'2/1/2000','a'), 
(2,'3/1/2000','c'), 
(1,'5/1/2000','a') 
(1,'6/1/2000','a') 
(2,'7/1/2000','c') 

empの状態の変更に関する記録とステータスを返す必要があります。

したがって、次の例では、前のレコードの日付が2000年2月1日のものと同じで、empのレコードがないため、emp#1のレコードの日付が3/1/2000のレコードは返されませんステータス値が変更されず、以前の最も近いレコード日付で記録されたため、6/1/2000に対して#1。ステータスが最も近い早くrecordate

empid, recorddate, status 
-------------------------------------- 
1,'1/1/2000','a' 
1/'2/1/2000','b' 
1,'4/1/2000','c' 
1,'5/1/2000','a' 
2,'2/1/2000','a' 
2,'3/1/2000','c' 

のために変化していなかったので、

とEMP#2の同じ概念が、レコードがそのEMPのため2000年7月1日recorddateで返されていない私は、使用してステータスの不変のシーケンス番号付けてみましたempidとステータス別に分割し、empidで注文し、記録し、各ウィンドウの "フレーム"からrownumber 1を選択して、最も早い時期に取得しますが、運はありません。 emwnのレコードで> 1回発生する可能性があるが、レコード間で不連続である場合、rownumberは1にリセットされません。

おかげ 県

答えて

0

あなたは簡単にLAG窓関数を使用してこの問題を解決することができます

select empid, recorddate, status 
from (
    select empid, recorddate, status, 
      coalesce(lag(status) over (partition by empid 
            order by recorddate), '') as prevstatus 
    from @test) as t 
where status <> prevstatus 
order by empid, recorddate 
+0

私の悪いです。私たちはSQL Server 2008 R2について説明しているはずです – user3389773

関連する問題