[ Oracle - OVER 1단계 ]

 

정의 : OVER analytic_clause 
        해당
 함수가 쿼리 결과 집합에 대해 적용되라는 지시어로써 FROM, WHERE, GROUP BY 
        HAVING
 이후에 계산되어 진다.

☞  

 

PARTITION BY 
   하나
 이상의 컬럼 또는 적합한 표현식이 사용될  있고 하나 이상의 컬럼 또는 
   표현식에
 의한 그룹으로 쿼리의 결과를 파티션한다. 
   
 구가 생략되면 단일 그룹처럼 쿼리 결과 집합이 처리된다. 
ORDER BY 

   하나
 이상의 컬럼 또는 적합한 표현식이 사용될  있고 
   하나
 이상의 컬럼 또는 표현식을 기준으로 파티션 내의 데이터를 정렬한다. 
   표현식은
 컬럼의 별칭 또는 위치를 나타내는 숫자를 사용할  없다. 

 1. 문제

 

  자료 : 기준일자 영업유무
         19810101 Y
         19810103 N
         19810104 Y
         19810105 N
         19810106 N
         19810107 N
         19810108 N
         19810109 N
         19810111 Y
     경우

결과 : 기준일자로 정렬해서 위에서 부터 Y 갯수를 COUNT 하기
             기준일자 영업유무  Y갯수
             19810101 Y         1
             19810103 N         1
             19810104 Y         2
             19810105 N         2
             19810106 N         2
             19810107 N         2
             19810108 N         2
             19810109 N         2
             19810111 Y         3;

WITH T AS ( 
     SELECT '19810101' DAT, 'Y' YN FROM DUAL UNION ALL
     SELECT '19810103' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810104' DAT, 'Y' YN FROM DUAL UNION ALL
     SELECT '19810105' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810106' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810107' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810108' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810109' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810111' DAT, 'Y' YN FROM DUAL 
) 
  SELECT DAT, YN, COUNT( DECODE( YN, 'Y', 1 ) ) OVER( ORDER BY DAT ASC ) GRP 
    FROM T  ;   

☞  문제2

 

     자료 : 기준일자 영업유무
            19810101 Y
            19810103 N
            19810104 Y
            19810105 N
            19810106 N
            19810107 N
            19810108 N
            19810109 N
            19810111 Y
    
 경우

    결과 : 기준일자로 정렬해서 위에서 휴무일자를 제외한 영업일자를 찾아오기
             기준일자 영업유무  영업일자
             19810101 Y         19810101
             19810103 N         19810104
             19810104 Y         19810104  
             
19810105 N         19810111 
             19810106 N         19810111    
             
19810107 N         19810111 
             19810108 N         19810111 
             19810109 N         19810111 
             19810111 Y         19810111;

WITH T AS ( 
     SELECT '19810101' DAT, 'Y' YN FROM DUAL UNION ALL
     SELECT '19810103' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810104' DAT, 'Y' YN FROM DUAL UNION ALL
     SELECT '19810105' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810106' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810107' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810108' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810109' DAT, 'N' YN FROM DUAL UNION ALL
     SELECT '19810111' DAT, 'Y' YN FROM DUAL UNION ALL
     SELECT '19810112' DAT, 'N' YN FROM DUAL
) 
SELECT DAT, YN, GRP, MAX( DAT ) OVER( PARTITION BY GRP ) A_DAT 
FROM ( 
       SELECT DAT, YN, COUNT( DECODE( YN, 'Y', 1 ) ) OVER( ORDER BY DAT DESC ) GRP 
         FROM T 
) 
ORDER BY DAT ;

 

'(DB) Oracle > SQL.통계-단계별Study' 카테고리의 다른 글

Oracle - MODEL 1단계  (0) 2017.01.21
Oracle - GROUPING() 3 단계  (0) 2017.01.21
Oracle - ROUPING() 2 단계  (0) 2017.01.21
Oracle - GROUPING() 1 단계  (0) 2017.01.21
Oracel - CUBE 1 단계  (0) 2017.01.21
Posted by 농부지기
,