2015-02-03 4 views
0

약간의 문제가있어 솔루션을 찾을 수 있기를 바랍니다.첫 번째 등록 된 행을 사용하여 UserID에 대한 다음 첫 번째 레코드 찾기

PersonID RowID  Reg_date  Reg_Time Process_first_Date Process_first_time Process_Last_Date Process_Last_time End_date  End_Time 
======== ========= ========== ======== ================== ================== ================= ================= ========== ======== 
05634222 3341278/2 01/01/2014 13:45  01/01/2014   13:45    02/01/2014   12:16    04/01/2014 18:22 
05634222 3341278/6 01/01/2014 13:45  02/01/2014   12:20    03/01/2014   16:43    04/01/2014 18:22 
05634222 3341278/4 01/01/2014 13:45  03/01/2014   16:48    04/01/2014   18:22    04/01/2014 18:22 
08674315 8445732/1 12/01/2014 18:20  12/01/2014   18:20    13/01/2014   14:08    16/01/2014 10:12 
08674315 8445732/6 12/01/2014 18:20  13/01/2014   14:12    14/01/2014   12:02    16/01/2014 10:12 
08674315 8445732/8 12/01/2014 18:20  14/01/2014   12:12    16/01/2014   10:12    16/01/2014 10:12 

을 주목 process_end_date/시간 일치 각 personID 등록 날짜/시간 및 process_first_time 일치 행 하나에 한 행의 종료 날짜/시간 :이 같은 설정 데이터를 말한다. 이것들은 입출력 과정들 - 그 과정들에 대한 첫 번째와 마지막 등록입니다.

PersonID은 첫 번째 및 마지막 등록 내에서 하나 이상의 프로세스를 가질 수 있습니다. 특정 기간에 이러한 최초 및 최종 등록의 여러 세트를 가질 수 있습니다.

그래서 내가 원하는 것은 특정 기간 동안 reg 날짜와 첫 번째 프로세스 날짜와 시간을 일치시켜 모든 첫 번째 등록을 사용하는 것입니다. 그러나 모든 첫 번째 등록을 얻지 만 한 사람에 대해 여러 개의 첫 번째 reg가있을 수 있음을 기억하십시오. 그 기간은 예를 들어 1 일에 하나, 8 일에 하나, 10 일에 하나; 1 개월 동안보고 있으면 1 위를 원합니다.

나는 등록 날짜별로 PersonID 주문을하여 분할, 내가 행 ID 파티션을 넣을 수있는 아이디어를 내놓았다 그리고 이것은 얻을 것 I 위의 데이터 집합 즉, 내가 원하는 것을 준 :

PersonID Row_partition RowID  Reg_date  Reg_Time Process_first_Date Process_first_time Process_Last_Date Process_Last_time End_date  End_Time 
======== ============= ========= ========== ======== ================== ================== ================= ================= ========== ======== 
05634222 1    3341278/2 01/01/2014 13:45  01/01/2014   13:45    02/01/2014   12:16    04/01/2014 18:22 
08674315 1    8445732/1 12/01/2014 18:20  12/01/2014   18:20    13/01/2014   14:08    16/01/2014 10:12 

이제 각 PersonID의 첫 번째 reg가 있는데 하위 쿼리 또는 인라인보기에서이 속성을 사용하려고합니다. 내가 어떻게이 일을 할 수 있는지 잘 모르겠다.

그래서 나는 나에게이 첫 번째 등록주고 쿼리 아래와 같습니다

SELECT * 
FROM(
select PersonID 
,Row_partition SEQ 
,RowID  
,Reg_date  
,Reg_Time 
,Process_first_Date 
,Process_first_time 
,Process_Last_Date 
,Process_Last_time 
,End_date  
,End_Time 
FROM PERSON INNER JOIN PROCESS_ACTIVITY ON (PERSON.PERSON_KEY=PROCESS_ACTIVITY.PERSON_KEY) 
RIGHT OUTER JOIN TIME PROCESS_START ON (PROCESS_START.DATE_KEY=PROCESS_ACTIVITY.PROCESS_START_DATE_KEY) 
RIGHT OUTER JOIN TIME PROCESS_END ON (PROCESS_END.DATE_KEY=PROCESS_ACTIVITY.PROCESS_END_DATE_KEY) 
RIGHT OUTER JOIN TIME REGDATE ON (REGDATE.DATEKEY=PROCESS_ACTIVITY.REG_DATE_KEY) 
RIGHT OUTER JOIN TIME ENDDATE ON (ENDDATE.DATEKEY=PROCESS_ACTIVITY.END_DATE_KEY) 
RIGHT OUTER JOIN DEPT ON (DEPT.DEP_KEY=PROCESS_ACTIVITY.FCE_DEP_KEY) 
INNER JOIN STAY ON (STAY_KEY=PROCESS_ACTIVITY.FCE_STAY_KEY) 
RIGHT OUTER JOIN dbo.LEAVECONDIT ON (dbo.LEAVECONDIT.D_PAC_LEAVECONDIT_KEY=PROCESS_ACTIVITY.LEAVECONDIT_KEY) 

WHERE REGDATE.FULLDATE BETWEEN '20140101' AND '20141231' 
AND DEPT.DEPT_DESC In ('DEPT1','DEPT2','DEPT3','DEPT4','DEPT5','DEPT6','DEPT7','DEPT8','DEPT9') 
AND dbo.LEAVECONDIT.LEAVE_CODE IN ('18','52','16','42','12','22','40','53','48') 
AND REGDATE.FULLDATE = PROCESS_START.FULLDATE 
AND convert(varchar(5),PROCESS_ACTIVITY.REG_TIME, 108) = convert(varchar(5),PROCESS_ACTIVITY.PROCESS_FIRST_TIME, 108) 
)B 
WHERE B.SEQ = 1 

을 그리고 나는 이것을 사용할 수 있다면 효과적으로 동일한 데이터 세트에 가입하고 첫 번째 후 다음 등록을 찾아 궁금 그 기간 동안의 것들?

희망이 없다면 나는 더 이상 설명 할 수 없다.

앤드류

편집 : 2 사람 ID를가 2014년 8월 1일 각각 15/01/2014에 다음 등록을 한 경우 마지막 출력, 출력은 다음과 같이 될 것이다 :

내가 할 경우
PersonID RowID  Reg_date  Reg_Time Process_first_Date Process_first_time Process_Last_Date Process_Last_time End_date  End_Time 
    ======== ========= ========== ======== ================== ================== ================= ================= ========== ======== 
    05634222 3368432/5 08/01/2014 16:00  08/01/2014   16:00    09/01/2014   18:06    10/01/2014 13:04 
    08674315 8653358/1 15/01/2014 12:20  15/01/2014   12:20    18/01/2014   14:14    19/01/2014 10:12 
+0

마지막 결과가 어떻게 표시 될 수 있습니까? 외부 적용을 사용하면 다음 레코드를 검색 할 수 있습니다. – mxix

+0

@mxix 두 개의 첫 번째 등록 (각 personID 당 하나씩)을 기반으로 출력 내용을 포함했습니다. – Andrew

+0

첫 번째 등록을 기반으로 출력을 포함하거나 원래 데이터에 출력을 포함시킬 수 있습니까? 어떤 행을 당신이 무엇에 합류하려고합니까? – mxix

답변

1

당신은 바로 당신이

;WITH cte AS(
select PersonID, 
,Row_partition SEQ 
... 
FROM PERSON INNER JOIN PROCESS_ACTIVITY ON ... 
) 
Select * from cte where Seq = 1 
Union All 
Select * from cte where Seq = 2 

또는

처럼, CTE를 통해 수행 할 수 있습니다 달성하기 위해 무엇을하려고하는 생각
;WITH cte AS(
select PersonID, 
,Row_partition SEQ 
... 
FROM PERSON INNER JOIN PROCESS_ACTIVITY ON ... 
) 
Select * from cte c1 
JOIN cte c2 on c1.PersonID = c2.PersonID AND c1.SEQ = 1 AND c2.SEQ = 2 
+0

그게 내가 필요로하는 것일 수도 있습니다. 나는 그것을 보게 될 것이지만이 cte를 이해하지 못하기 때문에 그것에 대해 약간의 독서를 할 것입니다. – Andrew