2012-12-14 5 views
2

이것은 내 첫 번째 게시물입니다. 나는 수표와 함께 일하고 있어요 , 나는 오라클 11g 데이터베이스이이상태 또는 범위별로 Oracle PLSQL 그룹화 검사

WITH cheques AS (
    SELECT 1 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 2 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 3 ch_no,'T' ch_status FROM dual UNION ALL 
    SELECT 4 ch_no,'T' ch_status FROM dual UNION ALL 
    SELECT 5 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 6 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 7 ch_no,'C' ch_status FROM dual UNION ALL 
    SELECT 8 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 9 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 10 ch_no,'C' ch_status FROM dual UNION ALL 
    SELECT 11 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 12 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 13 ch_no,'X' ch_status FROM dual UNION ALL 
    SELECT 14 ch_no,'X' ch_status FROM dual UNION ALL 
    SELECT 15 ch_no,'T' ch_status FROM dual UNION ALL 
    SELECT 16 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 17 ch_no,'U' ch_status FROM dual UNION ALL 
    SELECT 18 ch_no,'I' ch_status FROM dual UNION ALL 
    SELECT 19 ch_no,'I' ch_status FROM dual UNION ALL 
    SELECT 20 ch_no,'U' ch_status FROM dual 
) 

나는이 방법으로 그들을 얻을 상점 원하는 :

Status Min Max 
U 1 2 
U 5 6 
U 8 9 
U 11 12 
U 16 17 
U 20 20 
C 7 7 
C 10 10 
T 3 4 
T 15 15 
X 13 14 
I 18 19 

그래서, 서비스 2008보고에서, 내가 할 수 다음과 같이 표시하십시오 :

U  C  T  X  I 
Min Max Min Max Min Max Min Max Min Max 
1 2 7 7 3 4 13 14 18 19 
5 6 10 10 15 15    
8 9        
11 12        
16 17        
20 20  

여기에 질문은 상태를 기반으로 각 검사의 최소 및 최대를 얻는 방법입니다. 검색했지만 찾을 수 없습니다.

죄송합니다.

감사합니다.

+0

어떻게이 상태가'U'를 알고 '그 1'과'2' 쌍 등이 일치합니까? 쌍을 연관시키는 다른 식별자가 있습니까? – Taryn

+0

@bluefeet 그들은'ch_no' 연속 블록을 기반으로하는 것처럼 보입니다 –

답변

4

이것은 간단한 문제는 아니며 많은 단계가 필요합니다. (unbounded preceeding에 기본 창을 변경)을 order by와 분석과 같은 ch_status

  • 사용 sumch_no 각 연속 블록의 시작에서 '플래그를'설정

    1. 사용 lag 각각 수득 연속 블록의 고유 식별자를
    2. 결국 각 블록
    ,369 대한 minmax &을 계산하는 일반 group by를 사용

    쿼리 :

    WITH cheques AS (
        SELECT 1 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 2 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 3 ch_no,'T' ch_status FROM dual UNION ALL 
        SELECT 4 ch_no,'T' ch_status FROM dual UNION ALL 
        SELECT 5 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 6 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 7 ch_no,'C' ch_status FROM dual UNION ALL 
        SELECT 8 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 9 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 10 ch_no,'C' ch_status FROM dual UNION ALL 
        SELECT 11 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 12 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 13 ch_no,'X' ch_status FROM dual UNION ALL 
        SELECT 14 ch_no,'X' ch_status FROM dual UNION ALL 
        SELECT 15 ch_no,'T' ch_status FROM dual UNION ALL 
        SELECT 16 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 17 ch_no,'U' ch_status FROM dual UNION ALL 
        SELECT 18 ch_no,'I' ch_status FROM dual UNION ALL 
        SELECT 19 ch_no,'I' ch_status FROM dual UNION ALL 
        SELECT 20 ch_no,'U' ch_status FROM dual 
    ) 
    select ch_status, min(ch_no), max(ch_no) 
    from(select ch_no, ch_status, sum(changed_flag) over (order by ch_no) as grp 
         from(select ch_no, ch_status, 
            decode(ch_status,lag(ch_status) over(order by ch_no),0,1) 
            as changed_flag 
          from cheques)) 
    group by ch_status, grp 
    order by ch_status, min(ch_no) 
    

    결과 :

    | CH_STATUS | MIN(CH_NO) | MAX(CH_NO) | 
    --------------------------------------- 
    |   C |   7 |   7 | 
    |   C |   10 |   10 | 
    |   I |   18 |   19 | 
    |   T |   3 |   4 | 
    |   T |   15 |   15 | 
    |   U |   1 |   2 | 
    |   U |   5 |   6 | 
    |   U |   8 |   9 | 
    |   U |   11 |   12 | 
    |   U |   16 |   17 | 
    |   U |   20 |   20 | 
    |   X |   13 |   14 | 
    

    SQL 바이올린 here

  • +0

    예, 작동합니다! 대단히 감사합니다! – user1588751

    관련 문제