728x90
https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html
윈도우 함수
- 여러 개의 행을 하나의 집합으로 묶은 것을 하나의 윈도우라고 한다.
- 기본 구조
함수(컬럼) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
- 함수는 집계 함수를 사용할 수도 있고, 집계 함수가 아닌 함수를 사용할 수도 있다.
- OVER 뒤 괄호에 PARTITION BY 혹은 ORDER BY를 사용할 수 있다.
- PARTITION BY를 쓸 경우, 뒤에 쓰이는 컬럼을 기준으로 데이터가 분할된다.
- ORDER BY를 쓸 경우, 뒤에 쓰이는 컬럼을 기준으로 데이터를 정렬한다.
- 윈도우 함수는 SELECT절 / ORDER BY절에서만 사용 가능하다.
- 조건을 추가하고 싶다면 서브쿼리를 사용하면 된다.
사용 예시
1. MAX
- 각 부서의 최고 급여 구하기
SELECT Id
, Name
, Salary
, DepartmentId
-- 부서아이디를 기준으로 최댓값 구하기
, MAX(Salary) OVER (PARTITION BY DepartmentId) AS MaxSalary
FROM Employee;
2. SUM
- 각 라인별 누적 몸무게 구하기
SELECT Id
, Name
, Kg
, Line
-- 라인을 기준으로 몸무게 합 구하기
, SUM(Kg) OVER (PARTITION BY Id ORDER BY Line) AS CumSum
FROM Elevator;
3. LEAD, LAG
- LAG(컬럼) : 앞에 있는 데이터 값을 가져온다.
- LEAD(컬럼) : 뒤에 있는 데이터 값을 가져온다.
- 함수(컬럼, 칸 수) : 칸 수 뒤/앞에 있는 데이터 값을 가져온다.
- 함수(컬럼, default) : NULL 대신 default 값을 넣는다.
https://chaemi720.tistory.com/333
4. ROW_NUMBER, RANK, DENSE_RANK
- ROW_NUMBER() : 등수 매기기 (중복 등수x)
- RANK() : 등수 매기기, 점수가 같을 시 같은 등수 + 없는 등수 존재
- DENSE_RANK() : 등수 매기기, 점수가 같을 시 같은 등수
- 값에 따라 등수 구하기
SELECT val
, ROW_NUMBER() OVER (ORDER BY val) AS row_number
, RANK() OVER (ORDER BY val) AS rank
, DENSE_RANK() OVER (ORDER BY val) AS dense_rank
FROM Sample;
https://chaemi720.tistory.com/346
728x90
반응형
'TIL - 프로그래밍 > SQL' 카테고리의 다른 글
[리트코드] 185. Department Top Three Salaries - MySQL (0) | 2023.07.09 |
---|---|
[SQL] 누적합 구하는 3가지 방법 (0) | 2023.07.09 |
[SQL] LIMIT / OFFSET (0) | 2023.07.08 |
[리트코드] 177. Nth Highest Salary - MySQL (0) | 2023.07.08 |
[SQL] 사용자 정의 함수 (0) | 2023.07.08 |
댓글