[ Oracle - RANK() ]

  1. RANK()

 

정의 : 순위부여하기. 이때 동일한 점수는 돌인한 순위가 나와야 

 예   : 점수 - 100, 90, 90, 80 
        순위
 - 1,2,2,4    이렇게 나오기

SELECT empno, ename, jumsu
    ,  RANK() OVER (ORDER BY jumsu DESC ) as rk
     FROM example; 

  2. DENSE_RANK()

 

정의 : 중복 RANK 수와 무관하게 numbering 한다. 
   : 점수 - 100, 90, 90, 80 
       순위
 - 1,2,2,3    이렇게 나오기

SELECT empno, ename, jumsu
    ,  DENSE_RANK() OVER (ORDER BY jumsu DESC ) as rk
     FROM example; 

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - LAG.LEAD()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - LAG.LEAD() ]

 

 문제

 

  no | str | group |
  
------------------
  1  | ab  |   0   |
  
2  | cd  |   0   |
  3  | ef  |   0   |
  4  | gh  |  60   |
  5  | ij  |   0   |
  6  | kl  |   0   |
  7  | mn  |   30  |
  8  | mn  |   30  |
  9  | mn  |   0   |

이런 형식의 자료가 있습니다.
order
 by  no 기준으로 하면서 group 컬럼을 데이터 순서에 따라서 그룹을 지을  있는방법이 있나요?
말로 설명하자니  설명이 안되네요...아래 원하는 "zz" 컬럼 데이터 입니다.
도움 주시면 정말 감사하겠습니다...

  no | str | GRP   | B_GRP  |
  
---------------------------
  1  | ab  |   0   |    1   |
  2  | cd  |   0   |    1   |
  3  | ef  |   0   |    1   |
  4  | gh  |  60   |    2   |
  5  | ij  |   0   |    3   |
  6  | kl  |   0   |    3   |
  7  | mn  |  30   |    4   |
  8  | mn  |  30   |    4   |
  9  | mn  |   0   |    5   |

LAG  현재 게시물의  게시물 LEAD  현재 게시물의  게시물을 가져올수 있다.
LAG([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
LEAD([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
;

WITH T AS( 
    SELECT 1 NO, 'ab' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 2 NO, 'cd' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 3 NO, 'ef' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 4 NO, 'gh' STR, '60' GRP FROM DUAL UNION ALL
    SELECT 5 NO, 'ij' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 6 NO, 'kl' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 7 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 8 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 9 NO, 'mn' STR,  '0' GRP FROM DUAL 
) 
SELECT NO, STR, GRP, SUM(DECODE(GRP, BEF_GRP, 0, 1)) OVER(ORDER BY NO) B_GRP
  FROM (
        SELECT NO, STR, GRP, LAG(GRP, 1) OVER(ORDER BY NO) BEF_GRP
          FROM T
        ORDER BY NO
       )
  ;

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,

[ Oracle - MODEL 1단계 ]

 

정의 : MODEL 절은 SELECT 구문과 같이 사용되어 결과셋의 각각의 항목들을 연관배열 처럼취급해서 
       이러한 항목들을 일정한 계산규칙에 따라 계산을 수행한뒤 새로운 결과셋을 리턴한다.
       장점은 테이블을 이차원배열로 접근할  있어서 엑셀의 함수처럼 계산을 할수 있다
       즉
, 앞뒤 로우의 특정행에 접근할  있다

☞  [구문형식]

 

  SELECT ...
  FROM   ...
  MODEL [main]
        [ reference models ]
        [ PARTITION BY (<컬럼>) ]
        DIMENSION BY (<컬럼>)    
                         <------------ 로우를 식별할 기준이 되는 컬럼을 명시
        MEASURES (<컬럼>)                    
                         <
------------ 새로 계산이 되는 컬럼 명시
               [ IGNORE NAV ] | [ KEEP NAV ]
        [ RULES
          
<------------ RULES 절에는 MEASURES 절에서 명시한 컬럼들만 기술   있다.
                   [ UPSERT | UPDATE ]
                   [ AUTOMATIC ORDER | SEQUENTIAL ORDER ]
                   [ ITERATE (n) [UNTIL <CONDITION> ]
            ]
                   (<CELL_ASSIGNMENT > = <expression> ...) ;

☞ 예제

 

WITH MODEL_T AS
(
 SELECT '201101' TERM, 100000 SALARY FROM DUAL UNION ALL
  SELECT '201102' TERM, 112000 SALARY FROM DUAL UNION ALL
  SELECT '201103' TERM, 123000 SALARY FROM DUAL UNION ALL
  SELECT '201104' TERM, 131000 SALARY FROM DUAL UNION ALL
  SELECT '201105' TERM, 122000 SALARY FROM DUAL UNION ALL
  SELECT '201106' TERM, 140000 SALARY FROM DUAL UNION ALL
  SELECT '201107' TERM, 160000 SALARY FROM DUAL
) 
SELECT TERM, ORI_SAL, TAXES 
  FROM MODEL_T
MODEL
    DIMENSION BY (TERM) 
    MEASURES (SALARY ORI_SAL, SALARY TAXES )
RULES(
    ORI_SAL['200701'] = ORI_SAL['200701'] * 0.33,      -- 순서를  바꿔봤다.^^
    TAXES  ['200702'] = TAXES  ['200702'] * 0.33,
    TAXES  ['200703'] = TAXES  ['200703'] * 0.33,
    TAXES  ['200704'] = TAXES  ['200704'] * 0.33,
    TAXES  ['200705'] = TAXES  ['200705'] * 0.33,
    TAXES  ['200706'] = TAXES  ['200706'] * 0.33  )
ORDER
 BY 1

☞  

 

 DIMENSION 컬럼이 TERM 이다. 
   , DIMENSION 컬럼의 값을 연관배열의 KEY 처럼 사용해서 로우를 식별한다.
   여기서는 '20070x' 라는 컬럼값으로 로우를 식별하고 있다. 

SELECT TERM
     , SAL 
  FROM model_t
MODEL
    DIMENSION BY (term )
    MEASURES (SALARY sal)
RULES(
   SAL['QTR1']   = SAL['200701']+SAL['200702']+SAL['200703'],
   SAL['TOTAL1'] = sum(sal)[term IN ('200701','200702') ]
   SAL['TOTAL2'] = sum(sal)[term IN ('200701','200702') ]
)
ORDER
 BY 1;

 sum() 함수도 사용할  있는데 배열키값에 저런식으로도 사용이 가능.
 MODEL 절을 사용할 경우 SELECT 문장의 컬럼명은 MEASURES 절에서 반드시 명시한
    것들만 올수 있다. 
    따라서 그룹쿼리를 사용하기전에 MODEL절을 사용하여 계산을 마친 결과셋을 인라인뷰로
    사용해야한다. 
    왜냐면 SELECT 구문의 컬럼명이 MODEL 절에 종속적이기 때문이다.

 WITH TOTAL_T AS (
    SELECT NO, CAMP_CODE, GUBUN
         , MONTH_1, MONTH_2,MONTH_3, MONTH_4, MONTH_5, MONTH_6, MONTH_7,MONTH_8
         , MONTH_9, MONTH_10,MONTH_11,MONTH_12 
         , TOTAL 
      FROM DATA_1_T
    MODEL 
        DIMENSION BY (ID )
        MEASURES (TOTAL,MONTH_1, MONTH_2,MONTH_3, MONTH_4, MONTH_5,MONTH_6, MONTH_7
                 ,MONTH_8, MONTH_9,MONTH_10, MONTH_11,MONTH_12
                 ,ID NO,GUBUN,CAMP_CODE)
    RULES(
      TOTAL[ ANY ] = MONTH_1[cv(ID)] + MONTH_2[CV(ID)] + MONTH_3[CV(ID)] +MONTH_4[CV(ID)] + MONTH_5[CV(ID)] + MONTH_6[CV(ID)] + MONTH_7[CV(ID)] +MONTH_8[CV(ID)] + MONTH_9[CV(ID)] + MONTH_10[CV(ID)] + MONTH_11[CV(ID)] +MONTH_12[CV(ID)]
         )
)
 SELECT ROW_NUMBER() OVER (ORDER BY 1) RN1
      , ROW_NUMBER() OVER( PARTITION BY DTL_RGN_CODE ORDER BY GUBUN ) RN2
      , DECODE( ROW_NUMBER() OVER(PARTITION BY DTL_RGN_CODE ORDER BY GUBUN ) 
              , 1, DTL_RGN_CODE,' ') " "
      , NVL2(GUBUN,GUBUN,'합계') GUBUN
      , sum(MONTH_1) jan
      , sum(MONTH_2) feb
      , sum(MONTH_3) mar
      , sum(MONTH_4) apr
      , sum(MONTH_5) may
      , sum(MONTH_6) jun
      , sum(MONTH_7) jul
      , sum(total)   total
   from total_t a, CAMP_INFO_T b
  where a.CAMP_CODE = b.CAMP_CODE
  group by rollup(DTL_RGN_CODE,gubun) ;

 

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

Oracle - OVER 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 농부지기
,