2011-11-07 4 views
1

특정 상위 레코드의 상태 기록을 포함하는 하위 테이블이 있습니다.여러 행 사이의 시간 차이 계산 및 합계

표는 다음과 같습니다

Parent_id NUMBER(38) 
Date_Created DATE 
Status VARCHAR2(15) 

샘플 데이터 : 특정 PARENT_ID를 들어

1, sysdate-20, REQ 
1, sysdate-10, INPRG 
1, sysdate-5, WAIT 
1, sysdate-2, INPRG 
1, sysdate, COMP 

, 나는 PARENT_ID가 특정 상태에 머물 총 시간을 계산하는 방법? 계산이 다음 상태가 생성 된 날짜 인 경우, 날짜 레코드가 생성됩니다. 상태는 여러 번 발생할 수 있습니다.

샘플 데이터의 경우 레코드가 "INPRG"상태 인 총 시간을 어떻게 계산할 수 있습니까?

전체적으로 Oracle SQL에서 수행되어야합니다. 기능, 절차, 패키지 등이 없습니다.

미리 감사드립니다.

+0

고마워요! 그게 효과가 있었어. –

답변

1

각 상태에서 당신에게 총 시간을주고, 그래서 내 문법이 조금 꺼져있는 경우에 저를 용서 개념은 row_number을 활용하여 각 행을 다음 행에 자체 조인하고 이들 사이의 시간을 계산하는 것입니다. 그런 다음 원하는 데이터를 수집하기 만하면됩니다.

3

분석 함수 LEADLAG을 사용하여 결과 집합의 다음 또는 이전 행의 데이터에 액세스 할 수 있습니다. 이런 식으로 뭔가가

with base as (
    select Parent_id, Date_Created, Status, 
    row_number() over(partition by Parent_id order by Date_Created) as 'row' 
    from Table 
) 
select Parent_id, Status, sum(timeInStatus) 
from (
    select this.Parent_id, this.Status, 
    next.Date_Created-this.Date_Created as 'timeInStatus' 
    from base this 
    join base next on this.Parent_id=next.Parent_id 
        and this.row=next.row-1 
) t 
where Status = 'INPRG' 
group by Parent_id, Status 

기본에게 ... 내가 주로 SQL 서버가 아닌 오라클을 사용

SQL> ed 
Wrote file afiedt.buf 

    1 with t as (
    2 select 1 parent_id, sysdate-20 date_created, 'REQ' status from dual 
    3 union all 
    4 select 1, sysdate-10, 'INPRG' from dual 
    5 union all 
    6 select 1, sysdate-5, 'WAIT' from dual 
    7 union all 
    8 select 1, sysdate-2, 'INPRG' from dual 
    9 union all 
10 select 1, sysdate, 'COMP' from dual 
11 ) 
12 select parent_id, 
13   status, 
14   sum(time_in_status) 
15 from (
16  select parent_id, 
17    date_created, 
18    nvl(lead(date_created) over 
19       (partition by parent_id 
20        order by date_created), 
21     sysdate) next_status_date, 
22    nvl(lead(date_created) over 
23       (partition by parent_id 
24        order by date_created), 
25     sysdate) - 
26    date_created time_in_status, 
27    status 
28  from t) 
29* group by parent_id, status 
SQL>/

PARENT_ID STATU SUM(TIME_IN_STATUS) 
---------- ----- ------------------- 
     1 REQ     10 
     1 COMP     0 
     1 WAIT     3 
     1 INPRG     7