sqld 자격증 공부중에 이해가 안 가는 부분이 있습니다. 0 3 826

by 미카파엘 [Oracle 기초] [2018.03.11 17:11:19]


sql 전문가 각이드 2과목 2장 6절 윈도우 함수중에 

SQL> SELECT MGR, ENAME, HIREDATE, SAL,
            MIN(SAL) OVER(PARTITION BY MGR ORDER BY HIREDATE) as MGR_MIN 
    FROM EMP;

       MGR ENAME      HIREDATE         SAL    MGR_MIN
---------- ---------- --------- ---------- ----------
      7566 FORD       03-DEC-81       3000       3000
      7566 SCOTT      09-DEC-82       3000       3000
      7698 ALLEN      20-FEB-81       1600       1600
      7698 WARD       22-FEB-81       1250       1250
      7698 TURNER     08-SEP-81       1500       1250
      7698 MARTIN     28-SEP-81       1250       1250
      7698 JAMES      03-DEC-81        950        950
      7782 MILLER     23-JAN-82       1300       1300
      7788 ADAMS      12-JAN-83       1100       1100
      7839 JONES      02-APR-81       2975       2975
      7839 BLAKE      01-MAY-81       2850       2850
      7839 CLARK      09-JUN-81       2450       2450
      7902 SMITH      17-DEC-80        800        800
           KING       17-NOV-81       5000       5000

 

 위 부분에서 제가 예상한 결과는 

       MGR ENAME      HIREDATE         SAL    MGR_MIN
---------- ---------- --------- ---------- ----------
      7566 FORD       03-DEC-81       3000       3000
      7566 SCOTT      09-DEC-82       3000       3000
      7698 ALLEN      20-FEB-81       1600        950
      7698 WARD       22-FEB-81       1250        950
      7698 TURNER     08-SEP-81       1500        950
      7698 MARTIN     28-SEP-81       1250        950
      7698 JAMES      03-DEC-81        950        950
      7782 MILLER     23-JAN-82       1300       1300
      7788 ADAMS      12-JAN-83       1100       1100
      7839 JONES      02-APR-81       2975       2450
      7839 BLAKE      01-MAY-81       2850       2450
      7839 CLARK      09-JUN-81       2450       2450
      7902 SMITH      17-DEC-80        800        800
           KING       17-NOV-81       5000       5000

이렇게 예상을 했는데 예상과 다른 결과가 나오더군요. 그 이유를 좀 알고싶습니다.

by 마농 [2018.03.12 08:36:25]

PARTITION BY 구문이 그룹을 지정하구요
ORDER BY 구문이 정렬을 합니다.
이때 정렬된 결과의 현재행까지만 집계대상이 됩니다.
7698 1600 1600 = MIN(1600)
7698 1250 1250 = MIN(1600, 1250)
7698 1500 1250 = MIN(1600, 1250, 1500)
7698 1250 1250 = MIN(1600, 1250, 1500, 1250)
7698  950  950 = MIN(1600, 1250, 1500, 1250, 950)


by 미카파엘 [2018.03.13 11:17:55]

감사합니다. 제가 원하는 결과를 위해선 RANGE를 사용해야겠군요.


by 마농 [2018.03.13 11:43:18]

Range Between 절을 사용해도 되긴 하겠지만
Order By 를 제거하는게 더 맞겠지요.
정렬을 원하시면 맨 마지막에 정렬 추가하구요.
 

SELECT mgr, ename, hiredate, sal
     , MIN(sal) OVER(PARTITION BY mgr) mgr_min
  FROM emp
 ORDER BY mgr, hiredate
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입