[패스트캠퍼스 데이터 분석 부트캠프] 9주차_SQL 문법 (윈도우 함수)

2024. 4. 19. 09:36패스트캠퍼스 BDA 13기

 

깜푸의 패스트캠퍼스 데이터분석 부트캠프 9주차 학습일지

 


RANK, DENSE_RANK, ROW_NUMBER
: 순서 표현
  • RANK() OVER : 순위를 매기고 동일한 값이 있을 경우, 다음 순위는 건너뛴다 ex) 1,2,2,4 ...
  • DENSE_RANK() OVER : 순위를 매기고 동일한 값이 있을 경우, 다음 순위를 건너뛰지 않는다 ex) 1,2,2,3 ...
  • ROW_NUMBER() OVER : 순위와 상관없이 순서대로 각 행에 고유 번호를 부여한다 ex) 1,2,3,4 ...

※ 모두 (ORDER BY 절)과 함께 작성하여 어떤 기준으로 랭크 혹은 행번호를 부여할 것인지 명시해야함

ex) RANK() OVER (ORDER BY user_id ASC)

 

PARTITION BY
: 서브 그룹
  • PARTITION BY : 서브 그룹의 기준으로 살펴볼 수 있다. 예를 들면 customer_id 별로 렌탈 횟수를 살펴보는 경우, 각 렌탈 횟수에 몇번째 렌탈인지 번호를 부여한다고 할 때
SELECT
        customer_id,
        rental_date,
        COUNT(*) OVER (PARTITION BY customer_id ORDER BY rental_date 
                                      ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS rental_count
FROM DB

 

customer_id 별로 파티션을 나눠주고 rental_date로 정렬해준 뒤, 한 고객 당 누적 렌탈 횟수를 각각의 렌탈 건에 부여

LEAD, LEG
: 앞 뒤 값 가져오기
  • LEG(column, n, default) : 현재 행을 기준으로 n 행 앞의 값을 가져옴
  • LEAD(column, n, default) : 현재 행을 기준으로 n 행 뒤의 값을 가져옴

º n을 지정하지 않으면 기본으로 1

º 각각 앞 혹은 뒤에값이 없다면 default 값을 가져옴. default 값을 지정하지 않으면 null로 출력

※ 모두 (ORDER BY 절)과 함께 작성하여 어떤 기준으로 행을 정렬할 것인지 명시해야함

ex) LEG(customer_name, 1) OVER (ORDER BY customer_id ASC) 

: customer_id 를 기준으로 오름차순 정렬한 순서대로 1개의 행 앞의 customer_name을 가져옴

 

NTILE
: 전체를 N 개의 그룹으로 나누기
  • NTILE : 특정 컬럼을 기준으로 N개의 그룹을 생성할 수 있다

ex) NTILE(5) OVER (ORDER BY SUM(amount) DESC)  -- 이미 customer_id별로 sum(amount)값이 정렬되어있다고 가정

: 고객별 총 구매가격이 높은 순서대로 1~5까지 등급을 부여