본문 바로가기
개발/Database

윈도우 함수

by BellOne4222 2024. 2. 25.

윈도우 함수

  • 행고 행간의 관계를 쉽게 정의해주는 함수
  • 집계함수(AVG, SUM, COUNT), 윈도우 함수 전용 함수(ROW NUMBER, LEAD, LAG)
  • 순위, 합계, 평균, 행 위치 등을 조작

 

집계 함수

  • 뒤에 OVER()와 함께 사용하면 윈도우 함수, 안사용하면 집계함수
  • AVG()
  • COUNT()
  • MAX()
  • MIN()
  • SUM()

 

윈도우 함수 전용 함수

  • DENSE_RANK()
  • RANK()
  • ROW_NUMBER()
  • LAG()
  • LEAD()

 

기본 형식

  • 함수(컬럼) OVER (PARTITION BY 컬럼 ORDER BY 컬럼)
  • PARTITION 
    • 윈도우 함수에서 group by처럼 쓰이는데, 그룹화의 기준이 되는 컬럼을 파악할 수 있다. 
ex )  SUM(profit) OVER (PARTITION BY country) 

나라 별 profit 합 구하기  

 

ex) SUM(kg) OVER (ORDER BY Line)

Line 컬럼 순으로 kg 누적합 구하기 

 

ex) MAX(Salary) OVER (PARTITION BY DepartmentId) AS MaxSalary

 부서별 최고 봉급 구하기

 

집계 함수 SUM

  • SUM(컬럼) OVER()
    • 모든 ROW 집합을 하나의 PARTITION으로 간주
    • 윈도우 함수에서는 압축없이 모든 행을 보여주면서 파티션 별로 조회된 결과를 컬럼에 저장
SELECT
year, country, product, profit,
SUM(profit) OVER() AS total_profit,
SUM(profit) OVER(PARTITION BY country) AS country_profit
FROM sales
ORDER BY country, year, product, profit;

 

ROW_NUMBER(), RANK(), DENSE_RANK()

  • 윈도우 전용 함수
  • 순위를 구하기 위해 사용
  • ROW_NUMBER()
    • 중복값을 인식하지 못하고 순위를 부여
  • RANK()
    • 중복값이 오는 경우 같은 순위를 부여
  • DENSE_RANK()
    • 중복 값에 대해 같은 순위를 부여하지만 중복값에 대한 처리 이후
SELECT value
       ,ROW_NUMBER() OVER (ORDER BY value) AS 'row_number'
       ,RANK() OVER (ORDER BY value) AS 'rank'
       ,DENSE_RANK() OVER (ORDER BY value) AS 'dense_rank'
FROM tmp

 

LAG(), LEAD()

  • 2개의 행 간의 차이를 구할 때 사용
  • LAG()은 앞 행에서 값을 반환, LEAD()는 뒷 행에서 값을 반환

대륙 별 가장 높은 값과 본인의 인구수 차이를 계산

SELECT
	C.CODE,
    C.NAME,
    C.CONTINENT, # 대륙
    C.POPULATION, # 인구
    # 인구수 내림차순으로 정렬한 대륙별 이전 대륙의 인구수를 VALUE 컬럼으로 생성
    LAG(POPULATION) OVER(PARTITION BY CONTINENT ORDER BY POPULATION DESC) AS VALUE
    # 이전 대륙과 현재 대륙간 인구수 차이
    LAG(POPULATION) OVER(PARTITION BY CONTINENT ORDER BY POPULATION DESC) - C.POPULATION AS DIFFERNCE
FROM
	COUNTRY AS C

'개발 > Database' 카테고리의 다른 글

정규화, 트랜잭션  (2) 2024.03.06
데이터 모델링  (0) 2024.03.02
PK FK UK CK  (0) 2024.02.15
트랜잭션, 뷰, Date  (0) 2024.02.07
사용자 권한 주기 (GRANT)  (0) 2024.02.07