A. 금일 학습 내용

 

1. WINDOW FUNCTION

- 행과 행 간 비교, 연산, 관계를 정의하는 함수로 중첩하여 사용할 수는 없지만 서브쿼리에서는 사용이 가능하다.

-  아래와 같은 구조를 가지고 있다.

SELECT WINDOW 함수 OVER ([PARTITION BY 칼럼] [ORDER BY 칼럼] [WINDOW 절])
FROM 테이블명

- OVER 문을 반드시 사용하여야 한다.

- OVER : 쿼리 결과 집합 내의 윈도우 또는 사용자 지정 행 집합을 정의하며, WINDOW 함수를 사용하여 집계된 값을 계산한다.

- PARTITION BY : 특정 열을 기준으로 데이터를 나누며, 지정하지 않는다면 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급된다.

- ORDER BY : 항목을 정렬한다.

 

2. WINDOW 함수 종류

구분 함수
순위 함수 RANK, DENSE_RANK, ROW_NUMBER
일반 집계 함수 SUM, MAX, MIN, AVG, COUNT
그룹 내 행 순서 함수 FIRST_VALUE, LAST_VALUE, LAG, LEAD
그룹 내 비율 함수 RATIO_TO_REPORT, PERCENT_RANK, CUME_DIST, NTILE

 

2.1. ROW_NUMBER

- 동일한 값이어도 고유 순위를 부여하는 순위함수이다.

-  해당 함수를 사용하여 지난 번 with 문으로 풀었던 문제를 풀어보고자 한다.

[내일배움캠프_데이터분석] 7주차 화요일 TIL _ CTE :: journal201 님의 기록실 (tistory.com)

 

3. 문제에 적용하기

보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 
0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 
이때 결과는 시간대 순으로 정렬해야 합니다.

- 이 문제의 주 포인트는 0 ~23시까지의 칼럼을 새로 만들어야 한다는 점이다.

- 입양이 일어난 시간은 7~ 19시 사이이므로 그 외 시간을 나타내야 한다.

SELECT H.HOUR
      ,COUNT(O.ANIMAL_ID) AS COUNT
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY ANIMAL_ID) - 1 AS HOUR
    FROM ANIMAL_OUTS
    LIMIT 24
) AS H
    LEFT JOIN ANIMAL_OUTS AS O
        ON H.HOUR = HOUR(O.DATETIME)
GROUP BY 1

-  ROW_NUMBER 함수를 이용해 1부터 24까지 번호를 생성한 후, 0 ~ 23까지의 숫자를 출력하기 위해 -1 를 하였다.

- 시간을 기준으로 생성한 숫자와 ANIMAL_OUTS 테이블의 DATETIME을 JOIN 하였다.

- 이 방법을 통해 시간별 입양 건수를 출력할 수 있었다.

 

B. 마무리

- 해당 방법은 튜터님께서 가르쳐 주셨다.

- 분명 SQL 강의를 들을 때 WINDOW 함수에 대해 배웠던 것 같은데 활용하고자 생각지도 못했다.

- 이번 문제를 풀면서 WINDOW 함수까지 다시 한 번 공부할 수 있어 유익한 시간이었다.

 

+ Recent posts