2013-07-09 2 views
0

select 쿼리를 골라 내는데 어려움이 있습니다.Oracle Select 쿼리에 대한 도움이 필요합니다.

PFB는 테이블 및 대응하는 데이터 : 여기

Match_Status 0-->Initial Record 
      1-->Singel Match 
      2-->Multi Match 

마다 기록 용

ID DLS  MATCH_STATUS LAST_UPDATE_TIME  BO  CH FT 
1  0   0    09-07-2013 00:00:00 IT  TE NA 
1  1   1    09-07-2013 00:01:01 IT  TE NA 
2  0   0    09-07-2013 10:00:00 IP  TE NA 
3  0   0    09-07-2013 11:00:00 IT  YT NA 
3  2   2    09-07-2013 11:01:00 IT  YT NA 

는 match_status 0 이후 매칭 처리 단부 다른 번호로 초기 엔트리가있을 것 같은 1 , 2 업데이트됩니다.

나는 그런 다음

가 예상 밖으로 넣어

BO, CH 및 FT에 의해 총 기록, 대기 일치 하나의 일치 및 멀티 매치 그룹으로 레코드를 검색하려고 : 내가 가지고있는

BO CH FT TOTAL_RECORD AWAITNG_MATCH SINGLE_MATCH MULTI_MATCH 
IT TE NA 1    0    1    0 
IP TE NA 1    1    0    0 
IT YT NA 1    0    0    2 

을 나는 때문에 = 0을 match_status의 이해 위의 쿼리와

select BO,CH,FT,sum(case when match_status=0 then 1 else 0 end) as TOTAL_RECORD, 
sum(case when match_status = 0 then 1 else 0 end) as AWAITING_MATCH, 
sum(case when match_status = 1 then 1 else 0 end) as SINGLE_MATCH, 
sum(case when match_status = 2 then 1 else 0 end) as MULTI_MATCH from 
table1 where last_update_time >= current_timestamp-1 
group by BO,CH,FT; 

문제는, awaiting_match 총 기록으로 같은 채워지고있다

: 쿼리 아래 시도마찬가지로 나는 접근 방식 awaiting_match 후속 행 항목에 대해 동일한 값으로 채워지고있다

select BO,CH,FT,sum(case when match_status=0 then 1 else 0 end) as TOTAL_RECORD, 
select (sum(case when t1.ms=0 then 1 else 0 end) from 
(select max(match_status) as ms from table1 where last_update_time >= current_timestamp-1 group by id)t1))awaiting_match, 
sum(case when match_status = 1 then 1 else 0 end) as SINGLE_MATCH, 
sum(case when match_status = 2 then 1 else 0 end) as MULTI_MATCH from 
table1 where last_update_time >= current_timestamp-1 
group by BO,CH,FT; 

문제를 시도했다.

원하는 형식에 대한 적절한 쿼리를 도와주십시오.

미리 감사드립니다.

+0

예상 출력에 열을 무엇을 설명 할 것입니다 ('TOTAL_RECORD AWAITNG_MATCH SINGLE_MATCH MULTI_MATCH') 의미? – luchosrock

+0

각 단계의 레코드 수입니다. 예를 들어 ID가 1 인 레코드가 테이블에 삽입 된 경우 초기 상태는 일치 상태가 0이지만 대기 상태 일 때 0이되고 일치하는 프로세스가 끝나면 다음 삽입이 발생합니다 동일한 레코드이지만 다른 일치 상태는 단일 일치에 대해 1을 표시합니다. 등등 ... 총 레코드는 ID의 별개 수입니다. 일치하는 레코드는 현재 일치하는 상태 0에있는 레코드의 총 개수입니다. 일치하는 프로세스 끝과 후속 삽입이 발생하면주의해야합니다. 무대 –

답변

0

마지막으로의 성함이 필요합니다. 나는 이것이 실제로 상태의 최대량 인 것을 짐작하고있다. 그렇다면, 다음 id에 첫번째 그룹에 의해 문제를 해결하고 요약 할 그룹화를 수행 : 당신이 실제로 마지막 업데이트가 id의 상태를 제공하려면, 다음 열거 할 row_number()을 사용할 수 있습니다

select BO, CH, FT, 
     count(*) as TOTAL_RECORD, 
     sum(case when lastms = 0 then 1 else 0 end) as AWAITING_MATCH, 
     sum(case when lastms = 1 then 1 else 0 end) as SINGLE_MATCH, 
     sum(case when lastms = 2 then 1 else 0 end) as MULTI_MATCH 
from (select id, bo, ch, ft, MAX(match_status) as lastms 
     from table1 
     where last_update_time >= current_timestamp-1 
     group by id, bo, ch, ft 
    ) t 
group by BO, CH, FT; 

업데이트 시간 하강하여 각 ID, 주문에 대한 행 선택을 첫 번째 :

select BO, CH, FT, 
     count(*) as TOTAL_RECORD, 
     sum(case when lastms = 0 then 1 else 0 end) as AWAITING_MATCH, 
     sum(case when lastms = 1 then 1 else 0 end) as SINGLE_MATCH, 
     sum(case when lastms = 2 then 1 else 0 end) as MULTI_MATCH 
from (select id, bo, ch, ft, match_status, 
      ROW_NUMBER() over (partition by id order by last_update_time desc) as seqnum 
     from table1 
     where last_update_time >= current_timestamp-1 
    ) t 
where seqnum = 1 
group by BO, CH, FT; 
+0

Perfecto !!!!!!! 감사합니다 :) –

관련 문제