본문 바로가기
Language/MySQL

SQL 윈도우 함수

by Mesut Özil 2024. 1. 6.

SQL 윈도우 함수

윈도우 함수는 SQL에서 들을 기반으로 계산을 수행하는 함수입니다.

이 함수들은 "윈도우" 또는 "창"이라고 불리는 특정 데이터 세트의 부분에 대해 계산을 수행하며,

이를 통해 행 간 상대적인 관계 분석할 수 있습니다.

윈도우 함수는 OVER() 절을 사용하여 정의되며, 이 절 내에서 윈도우의 범위를 지정합니다.

 

1. NTILE(n)

  • 결과 집합을 n개 동일한 크기의 그룹으로 나눕니다. 각 그룹번호가 매겨지며, n값에 따라 그룹의 개수 결정
  • 'PARTITION BY'를 추가하여 category별 계산
SELECT category,
	value,
    	NTILE(2) OVER (PARTITION BY category ORDER BY value) AS bucket
FROM example_data;

# 결과
+---------+-------+--------+
|category | value | bucket |
+---------+-------+--------+
| A       | 10    | 1      |
| A       | 20    | 1      |
| A       | 30    | 2      |
| B       |  5    | 1      |
| B       | 15    | 2      |
+---------+-------+--------+


2. FIRST_VALUE() / LAST_VALUE()

  • FIRST_VALUE(): 에 속한 첫 번째 행 반환
  • LAST_VALUE(): 에 속한 마지막 반환
  • 'PARTITION BY'를 추가하여 category별 계산
# FIRST_VALUE()
SELECT
    category,
    value,
    FIRST_VALUE(value) OVER (PARTITION BY category ORDER BY value) AS first_value
FROM example_data;
    
# FIRST_VALUE() 결과
+----------+-------+-------------+
| category | value | first_value |
+----------|-------|-------------+
|    A     |  10   |      10     |
|    A     |  20   |      10     |
|    B     |  30   |      10     |
|    B     |   5   |       5     |
|    B     |  15   |       5     |
+----------|-------|-------------+

----------------------------------------------------------------------------------

# LAST_VALUE()
SELECT
    category,
    value,
    LAST_VALUE(value) OVER (PARTITION BY category ORDER BY value) AS last_value
FROM example_data;

# LAST_VALUE() 결과
+----------+-------+------------+
| category | value | last_value |
+----------|-------|------------+
|    A     |  10   |     30     |
|    A     |  20   |     30     |
|    B     |  30   |     30     |
|    B     |   5   |     15     |
|    B     |  15   |     15     |
+----------|-------|------------+


3. PERCENT_RANK()

  • 각 행에 대해 백분율 순위를 할당
SELECT
    category,
    value,
    PERCENT_RANK() OVER (PARTITION BY category ORDER BY value) AS percent_rank
FROM example_data;

# 결과
+----------+-------+--------------+
| category | value | percent_rank |
+----------+-------+--------------+
| A        | 10    | 0            |
| A        | 20    | 0.5          |
| B        | 30    | 1            |
| B        |  5    | 0            |
| B        | 15    | 1            |
+----------+-------+--------------+


4. CUME_DIST()

  • 각 행에 대해 누적 분포를 나타내는 값을 할당
SELECT
    category,
    value,
    CUME_DIST() OVER (PARTITION BY category ORDER BY value) AS cume_dist
FROM example_data;

# 결과
+----------+-------+-----------+
| category | value | cume_dist |
+----------+-------+-----------+
| A        | 10    | 0.3333333 |
| A        | 20    | 0.6666666 |
| B        | 30    | 1         |
| B        |  5    | 0.5       |
| B        | 15    | 1         |
+----------+-------+-----------+

 

 

 

본 게시글은 ChatGPT의 도움을 받아 작성하였습니다.

'Language > MySQL' 카테고리의 다른 글

SQL 기본 명령어  (0) 2024.01.08
가상 테이블 생성  (0) 2024.01.07
CONCAT 함수  (0) 2024.01.05
재귀 함수  (0) 2024.01.04
DataBase (데이터베이스)  (2) 2024.01.03