2016-07-21 4 views
2

내 문제를 해결하기 위해 1 1/2 교대로 시도했으나 제대로 도달하지 못했습니다. 커서로 약 15 분 만에 그것을 해결하고 충분히 빨리 실행됩니다. 하지만 설정 기반으로 할 수있는 방법이 있는지 궁금합니다.연속되지 않은 시퀀스의 첫 번째 레코드를 식별하는 TSQL

제 3 자 인사 관리 응용 프로그램 (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의 상태 변화에 대한 기록과 상태를 반환해야합니다.

따라서 아래 예에서 2/1/2000의 이전 레코드 날짜와 동일한 상태이므로 emp # 1의 레코드 날짜가 3/1/2000 인 레코드는 반환되지 않으며 emp 상태 값이 변경되지 않았기 때문에 6/1/2000에 대한 # 1. 가장 가까운 이전 recorddate로 기록하십시오. 상태가 가장 가까운 이전 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와 status에 의한 분할, empid에 의한 순서, recorddate 그리고 각 창 "프레임"에서 rownumber 1을 선택하여 가장 빠른 발생을 얻습니다. 그러나 행운은 없습니다. rownumber는 상태가 emp에 대한 레코드에서> 1 번 발생하지만 recorddates 간에는 불연속 일 때 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