ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] sum() over()
    DB/Oracle 2019. 9. 5. 03:36

    [배경] over() 내 order by 구문으로 결과가 다르게 나타난다

     

    WITH t AS 
    ( 
    SELECT '20150801' dt, 1 id FROM dual 
    UNION ALL SELECT '20150801', 2 FROM dual 
    UNION ALL SELECT '20150801', 1 FROM dual 
    UNION ALL SELECT '20150802', 1 FROM dual 
    UNION ALL SELECT '20150802', 2 FROM dual 
    UNION ALL SELECT '20150802', 2 FROM dual 
    UNION ALL SELECT '20150803', 3 FROM dual 
    UNION ALL SELECT '20150804', 4 FROM dual 
    UNION ALL SELECT '20150804', 1 FROM dual 
    UNION ALL SELECT '20150805', 1 FROM dual 
    ) 
    SELECT dt 
    ,count(dt) 
    ,SUM(COUNT(dt)) OVER(ORDER BY DT) A 		***
    ,SUM(COUNT(dt)) OVER() B 			***
    FROM t 
    GROUP BY DT;

     

    [결과화면] 


    [경과] over()의 order by는 

    1) 파티션 내 순서 지정함

    2) rows / range의 이전 및 다음 행을 확인하는 기준

     

    OVER (   
           [ <PARTITION BY clause> ]  
           [ <ORDER BY clause> ]         ... 파티션 내 순서 지정
           [ <ROW or RANGE clause> ]     ... 파티션 내 행 제한, 행 범위 지정**
    )  
          
    ** 기본 값이 있다. 정렬된 결과의 처음부터 현재행까지.
    ** RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

    [결과]
    SUM(COUNT(dt)) OVER()                          ... 모든 'count(dt)' 로우의 합
    SUM(COUNT(dt)) OVER(PARTITION BY dt)    ... dt별 'count(dt)' 로우의 합
    SUM(COUNT(dt)) OVER(ORDER BY DT)        ... 'count(dt)' 로우의 첫행에서 현재행까지 합

    'DB > Oracle' 카테고리의 다른 글

    [Oracle] basic  (0) 2020.03.22
Designed by Tistory.