DB 이야기

디비 이야기 12. 데이터 값 순위 매기기와 집합함수

김푸른초푸른 2020. 3. 7. 22:40

1. RANK <-> DENSE_RANK

= 공통순위를 출력하되 공통순위만큼 건너뛰어 다음 순위 출력한다

EX) RANK() OVER([PARTITION BY 컬럼명] ORDER BY 컬럼명) 

-> 그룹으로 묶어서 순위를 매겨야할 내용 : partition 

   순위를 매길 함수 : order by 

 

ex) SELECT team_id, RANK() OVER(PARTITION BY team_id ORDER BY user_win desc) RANK FROM USERS;

 

2. ROW_NUMBER / ROWNUM

= 공통순위 없이 출력한다 / 각 행에 부여하는 일련변호 

테이블에서 원하는 만큼 행만 가져오고 싶을시 WHERE 절에서 사용한다 (+ 단일행 연산자)

EX) SELECT team_id, ROW_NUMBER() OVER(PARTITION BY team_id ORDER BY user_tot desc) RANK FROM USERS;

-> 단, PARTITION BY를 줄 컬럼에 중복된 값을 기준으로 등급을 매긴다 

(수학이란 과목명을 PARTITION BY로 주고 점수를 ORDER BY로 줄 경우 수학에 대한 등급이 매겨진다)

 

EX) SELECT team_id FROM USERS WHERE ROWNUM < 2;

 

3. OVER 함수 

= 그룹함수, 분석함수와 같이 쓰이며

GROUP BY / ORDER BY를 이용한 서브쿼리 계산 위해 등장함 

 

4. TOP 함수 (= LIMIT)

= 결과 집합으로 출력되는 행의 갯수를 제한한다 

문법 : SELECT TOP(반환할 행의 수) 컬럼명 FROM 테이블명 WHERE 조건 

EX) SELECT TOP(N) team_id FROM USERS (SQL)

-> N개 이상의 건을 조회할시 사용한다 

 

EX) SELECT * FROM DEPT WHERE DEPTNO LIMIT 3; (MYSQL)

-> 3줄만 나오게 된다 / 무조건 WHERE절 뒤에서 사용해야한다 

 

=> TOP / ROWNUM은 ORDER BY 절을 사용함에 따라 성능차이가 있다! 

 

 

5. FIRST_VALUE(=MIN) <-> LAST_VALUE(= MAX)

= 파티션별로 윈도우에서 가장 먼저 나온 값을 구한다

 

EX) SELECT DEPTNO, ENAME, SAL
     , FIRST_VALUE(ENAME) OVER (PARTITION BY DEPTNO ORDER BY SAL DESC ROWS UNBOUNDED PRECEDING) as DEPT_RICH
  FROM EMP;

 

6. LAG(컬럼명, 몇번쨰 앞 행, 기본값) <-> LEAD

= 선행, 후행 ROW 값을 가져온다. 

* 몇번째 앞 행의 정보를 가져와 세팅한다. 그리고 해당 ROW 선행/후행전까지 기본값으로 세팅된다. 

 

EX) SELECT ENAME, HIREDATE, SAL
     , LAG(SAL, 2, 0) OVER (ORDER BY HIREDATE) as PREV_SAL  // 2번이면 2번재까지 기본값으로 채워진다. 
  FROM EMP
 WHERE JOB = 'SALESMAN' ;

 

7. RATIO_TO_REPORT(컬럼명)

= 파티션 내 전체 SUM 값에 대한 컬럼 값의 백분율 소수점으로 구한다 

EX) SELECT ENAME, SAL
     , ROUND(RATIO_TO_REPORT(SAL) OVER (), 2) as R_R
  FROM EMP
 WHERE JOB = 'SALESMAN';

=> 전체합은 1이된다 

 

8. PERCENT_RANK()

= 파티션별로 젤 먼저 나온 걸 0 / 젤 늦게 나온것을 1로 하고, 값이 아닌 행의 순서로 백분률을 구한다

EX) SELECT DEPTNO, ENAME, SAL
     , PERCENT_RANK() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) as P_R
  FROM EMP;

 

9. CUME_DIST()

= 파티션 별로 전체 행보다 작거나 같은 건수에 대한 누적백분률을 구한다

EX) SELECT DEPTNO, ENAME, SAL
     , CUME_DIST() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) as P_R
  FROM EMP;

 

10. NTITLE(몇 등분할 수)

= 파티션별로 전체 건수를 N등분한 결과 

EX) select NTILE(5) OVER(ORDER BY FIRST_NAME) AS TEST 
     , ID
     , FIRST_NAME
     , LAST_NAME
  FROM sql_test_a;

// 순서대로 앞에 있는게 여러개가 된다. 나머지는 중복없이 번호가 할당된다. 

 

 

 

 

'DB 이야기' 카테고리의 다른 글

디비이야기 15. 조인  (0) 2020.03.08
디비 이야기 13. 집계함수   (0) 2020.03.08
디비 이야기 11. 날짜 함수  (0) 2020.03.07
디비 이야기 10. 숫자타입 함수  (0) 2020.03.06
디비 이야기 9. 대소문자 변환   (0) 2020.03.05