윈도우 프레임 SQL : ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
Data Analyst

빅데이터 관련 자료/[SQL] Basic

윈도우 프레임 SQL : ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

carpe08 2024. 4. 11. 17:04
320x100
320x100

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 구문은 SQL의 윈도우 함수에서 사용되며, 윈도우 프레임을 정의합니다. 이것을 심화 버전으로 설명하면 다음과 같습니다:

윈도우 프레임

윈도우 프레임은 윈도우 함수가 작동할 데이터의 범위를 정의합니다. 윈도우 프레임을 설정함으로써 함수는 해당 프레임 내에서만 작동하게 됩니다.

- UNBOUNDED PRECEDING

UNBOUNDED PRECEDING은 윈도우 프레임의 시작을 나타냅니다. 이것은 현재 행을 포함한 윈도우의 가장 첫 번째 행을 지정합니다.

- UNBOUNDED FOLLOWING

UNBOUNDED FOLLOWING은 윈도우 프레임의 끝을 나타냅니다. 이것은 현재 행을 포함한 윈도우의 가장 마지막 행을 지정합니다.

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

따라서 ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 구문은 현재 행을 포함한 전체 데이터 세트를 윈도우로 사용함을 의미합니다. 이는 함수가 데이터 집합 전체를 대상으로 작동하게 됨을 의미합니다. 다시 말해, 윈도우 함수는 데이터 집합 내의 모든 행을 고려하여 작동하게 됩니다.

이 구문은 종종 집계 함수와 함께 사용되어 데이터 집합 전체에 대한 집계를 수행하거나, 전체 데이터에 대한 비교 및 분석을 수행하는 데 유용합니다.

 

예제 데이터

ID Name Score

1 Alice 85
2 Bob 72
3 Charlie 90
4 Dave 68

이 데이터를 사용하여 모든 학생의 성적 평균을 계산하는 쿼리를 작성해보겠습니다.

sqlCopy code
SELECT
    ID,
    Name,
    Score,
    AVG(Score) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS Overall_Average
FROM
    Students;

위 쿼리에서 AVG(Score) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) 부분은 모든 행을 대상으로 평균을 계산하도록 지정합니다. 결과는 다음과 같습니다:

ID Name Score Overall_Average

1 Alice 85 78.75
2 Bob 72 78.75
3 Charlie 90 78.75
4 Dave 68 78.75

이 결과는 모든 학생의 성적 평균이 78.75임을 보여줍니다.

ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING를 사용하여 윈도우를 전체 데이터 집합으로 설정하여 모든 행에 대해 이 평균을 계산했습니다.

 

FIRST_VALUE 함수를 사용하여 각 학생의 성적과 함께 첫 번째 학생의 성적을 함께 출력하는 예제를 제공하겠습니다.

sqlCopy code
SELECT
    ID,
    Name,
    Score,
    FIRST_VALUE(Score) OVER (ORDER BY ID) AS First_Student_Score
FROM
    Students;

위 쿼리에서 FIRST_VALUE(Score) OVER (ORDER BY ID) 부분은 ID를 기준으로 정렬된 순서에서 첫 번째 학생의 성적을 반환합니다. 결과는 다음과 같습니다:

ID Name Score First_Student_Score

1 Alice 85 85
2 Bob 72 85
3 Charlie 90 85
4 Dave 68 85

이 결과에서 첫 번째 학생인 Alice의 성적인 85가 모든 행에 대해 출력됨을 확인할 수 있습니다. FIRST_VALUE 함수는 주어진 정렬 순서에서 첫 번째 값을 반환하기 때문에, 각 행마다 첫 번째 학생의 성적이 같게 출력됩니다.

 

PARTITION BY 구문을 사용하여 각 학생의 성적과 함께 그들이 속한 그룹의 첫 번째 학생의 성적을 출력하는 예제를 제공하겠습니다.

sqlCopy code
SELECT
    ID,
    Name,
    Score,
    FIRST_VALUE(Score) OVER (PARTITION BY 1 ORDER BY ID) AS First_Student_Score
FROM
    Students;

위 쿼리에서 PARTITION BY 1은 데이터 집합을 하나의 파티션으로 나누는데, 이는 모든 행을 하나의 그룹으로 간주하게 됩니다. 그리고 ORDER BY ID는 각 그룹 내에서 학생들을 ID 기준으로 정렬합니다. 결과는 다음과 같습니다:

ID Name Score First_Student_Score

1 Alice 85 85
2 Bob 72 85
3 Charlie 90 85
4 Dave 68 85

이 결과에서 모든 행이 같은 그룹으로 처리되고, 따라서 첫 번째 학생인 Alice의 성적이 모든 행에 대해 출력됨을 확인할 수 있습니다.

 

 

예제 데이터

ID Name Score Class

1 Alice 85 A
2 Bob 72 B
3 Charlie 90 A
4 Dave 68 B
sqlCopy code
SELECT
    ID,
    Name,
    Score,
    Class,
    FIRST_VALUE(Score) OVER (PARTITION BY Class ORDER BY ID) AS First_Student_Score
FROM
    Students;

위 쿼리에서 PARTITION BY Class는 데이터를 Class 컬럼 값으로 그룹화하고, ORDER BY ID는 각 그룹 내에서 학생들을 ID 순으로 정렬합니다. 결과는 다음과 같습니다:

ID Name Score Class First_Student_Score

1 Alice 85 A 85
2 Bob 72 B 72
3 Charlie 90 A 85
4 Dave 68 B 72

이 결과에서 각 학생의 성적과 함께 그들이 속한 클래스 내에서 첫 번째 학생의 성적이 출력됩니다. Alice와 Charlie는 둘 다 클래스 A에 속하며, 따라서 첫 번째 학생인 Alice의 성적이 모든 A 클래스 학생들에게 출력됩니다. 비슷하게, Bob와 Dave는 둘 다 클래스 B에 속하며, 따라서 첫 번째 학생인 Bob의 성적이 모든 B 클래스 학생들에게 출력됩니다.

320x100
320x100