본문 바로가기
TIL - 프로그래밍/SQL

[SQL] 윈도우 함수 (Window Functions)

by chaemj97 2023. 7. 9.
728x90

https://dev.mysql.com/doc/refman/8.0/en/window-functions-usage.html

 

MySQL :: MySQL 8.0 Reference Manual :: 12.20.2 Window Function Concepts and Syntax

12.20.2 Window Function Concepts and Syntax This section describes how to use window functions. Examples use the same sales information data set as found in the discussion of the GROUPING() function in Section 12.19.2, “GROUP BY Modifiers”: mysql> SE

dev.mysql.com


윈도우 함수

  • 여러 개의 행을 하나의 집합으로 묶은 것을 하나의 윈도우라고 한다.
  • 기본 구조
함수(컬럼) 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

 

[리트코드] 180. Consecutive Numbers - MySQL

https://leetcode.com/problems/consecutive-numbers/ Consecutive Numbers - LeetCode Can you solve this real interview question? Consecutive Numbers - Table: Logs +-------------+---------+ | Column Name | Type | +-------------+---------+ | id | int | | num |

chaemi720.tistory.com

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

 

[리트코드] 185. Department Top Three Salaries - MySQL

https://leetcode.com/problems/department-top-three-salaries/ Department Top Three Salaries - LeetCode Can you solve this real interview question? Department Top Three Salaries - Table: Employee +--------------+---------+ | Column Name | Type | +-----------

chaemi720.tistory.com

 

728x90
반응형

댓글