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 함수까지 다시 한 번 공부할 수 있어 유익한 시간이었다.
'Today I Learned' 카테고리의 다른 글
[TIL] 알고리즘 코드카타_행렬 (0) | 2024.08.12 |
---|---|
[내일배움캠프_데이터분석] 7주차 금요일 TIL _ SQL 문제해결 (0) | 2024.08.09 |
[내일배움캠프_데이터분석] 7주차 화요일 TIL _ CTE (0) | 2024.08.06 |
[내일배움캠프_데이터분석] 7주차 월요일 TIL _ ADsP 3과목 정리 (0) | 2024.08.05 |
[내일배움캠프_데이터분석] 6주차 금요일 TIL _ 기초통계학 (0) | 2024.08.02 |