2013-06-17 3 views
1

oracle에서 여러 행을 함께 모으는 최선의 방법을 찾으려고합니다. 프로세스 흐름을 거치면서 주요 사용자 이벤트를 기록하는 테이블이 있습니다.Oracle 11g 집계 행

User ID  Start Date/Time  End Date/Time 
1   17/06/2013 11:00 17/06/2013 11:05 
2   16/06/2013 11:00 16/06/2013 11:05 

내가 : 우리는 아래의 형식으로 사용자에게 특정 이벤트 코드에 대한 타임 스탬프를 캡처합니다 우리의 데이터베이스에서 보고서를 얻을 찾고 있습니다

User Id Event Code Event Timestamp 
1   START  17/06/2013 11:00 
1   END   17/06/2013 11:05 
2   START  16/06/2013 11:00 
2   END   16/06/2013 11:05 

: 우리는 다음과 같은 테이블 구조를 가지고 SQL에서이 작업을 수행하는 방법을 모르는 경우 가장 좋은 방법을 생각하면 조언을 얻을 수 있습니다.

+1

사용자 1은 둘 이상의 시작일 또는 종료일을 가질 수 있습니까? – Randy

+0

우리가 캡처 할 일회성 사건. – BandyOrc

+0

"최선의 방법"이 아닐 수도 있습니다. http://sqlfiddle.com/#!4/80803/2 – Passerby

답변

3

표가 설명 된 방식이라고 가정하면 간단한 PIVOT으로이 작업을 수행 할 수 있습니다.

을 감안할 때 :

create table event (id number, event_code varchar2(5), tstamp date); 

insert into event values (1, 'START', to_date('17/06/2013 11:00','DD/MM/YYYY HH24:MI')); 
insert into event values (1, 'END', to_date('17/06/2013 11:05','DD/MM/YYYY HH24:MI')); 
insert into event values (2, 'START', to_date('16/06/2013 11:00','DD/MM/YYYY HH24:MI')); 
insert into event values (2, 'END', to_date('16/06/2013 11:05','DD/MM/YYYY HH24:MI')); 

이 쿼리는 다음과 같습니다

select * 
    from event 
pivot (max(tstamp) for event_code in ('START','END')) 

Here's a SQL Fiddle

+0

감사합니다. 이것은 매력처럼 작동합니다. 정확한보고 요구 사항을 충족시키기 위해이 작업을 수행 할 수있었습니다. – BandyOrc

0

실제 데이터는 표시로 간단 경우 - 그럼 그냥 두 번 같은 테이블을 참조하여 쿼리 - 한 번 시작 데이터를 검색하고 한 번만 종료 날짜 ...

작업
select user_id, s.event_tm, as start_time, e.event_tm as end_time 
from 
(select user_id, event_tm from mytable where event_cd = 'START') s 
,(select user_id, event_tm from mytable where event_cd = 'END') e 
where s.user_id = e.user_id 

사용자 당 하나 개의 이벤트를 가정 http://www.sqlfiddle.com/#!4/d141c/7

0

바이올린 :

SELECT 
Userid 
,MAX(CASE WHEN flag = 'START' THEN dt END) AS started 
,MAX(CASE WHEN flag = 'END' THEN dt END) AS Ended 
FROM 
(
SELECT 1 as userid,   'START' as flag , '17/06/2013 11:00' as dt FROM DUAL 
UNION ALL SELECT 1,   'END' as flag , '17/06/2013 11:05' As dt FROM DUAL 
UNION ALL SELECT 2,   'START'  as flag , '16/06/2013 11:00' As dt FROM DUAL 
UNION ALL SELECT 2,   'END'  as flag, '16/06/2013 11:05' As dt FROM DUAL 
) a 
GROUP BY userid 
0

이벤트 코드 값이 일치하고 '시작'과 '끝'당신은 당신의 테이블에 가입 할 수 있습니다 사이에 다른 경우 자체 및 필터링 결과 :

select t1.id as "User ID", t1."Event Timestamp" as "Start DateTime", t2."Event Timestamp" as "Start DateTime" 
from your_table t1, your_table t2 
where t1.id = t2.id and t1."Event Code" = 'START' and t2."Event Code" = 'END'