ROWS & RANGE 기준
Coddy SQL 여정의 기초 섹션에 포함된 레슨. 72개 중 69번째.
현재로서는 고려할 이전 또는 이후 행의 수를 선택하는 데 유연하게 대응할 수 없습니다. 이제 ROWS 및 RANGE 기준을 사용하면 가능합니다. 이를 사용하려면 다음과 같이 작성합니다:
OVER (ROWS BETWEEN --START-- AND --END--)
OVER (RANGE BETWEEN --START-- AND --END--)
다음 옵션을 지정할 수 있습니다:
CURRENT ROW- 현재 행n PRECEDING- 현재 행 이전의 행n FOLLOWING- 현재 행 이후의 행
ROWS와 RANGE의 차이점은 ROWS 기준은 값에는 신경 쓰지 않고 위치만 고려하는 반면, RANGE는 행 위치가 아니라 값의 범위로 윈도우를 정의한다는 것입니다.
RANGE의 경우 ORDER BY --column_name--을 반드시 지정해야 합니다. 그렇지 않으면 윈도우를 어떻게 선택해야 하는지 알 수 없기 때문입니다.
예를 들어:
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING여기서는 현재 행, 그 앞의 행, 그리고 그 뒤의 행을 포함하는 윈도우를 생성합니다.
RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING ORDER BY levels여기서는 각 levels에 대해(오름차순으로 정렬되어) 현재 levels, 그 이전의 한 levels, 그 이후의 한 levels를 포함하는 윈도우를 생성합니다. 현재 levels가 5라면 levels 4, 5, 6을 포함합니다.
참고: RANGE BETWEEN을 사용하면 윈도우에 포함되는 행이 더 많아질 수 있습니다. 이는 해당 범위의 값과 동일한 값을 공유하는 모든 행을 포함하기 때문입니다. 반면 ROWS BETWEEN은 데이터 세트에서 해당 행을 사용할 수 있는 한 항상 동일한 수의 행을 포함합니다.
또한 RANGE는 날짜 열을 지원하지 않습니다.
다음은 ROWS와 RANGE의 차이를 보여주는 간단한 예입니다:
ROWS 사용:
SELECT employee_name, salary,
AVG(salary) OVER (
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
) as avg_salary_rowsRANGE 사용:
SELECT employee_name, salary,
AVG(salary) OVER (
ORDER BY salary
RANGE BETWEEN 1000 PRECEDING AND 1000 FOLLOWING
) as avg_salary_range챌린지
쉬움사용 가능한 테이블 및 열:
newspapers:date,num_newspapers
이 챌린지에서는 production을 위한 newspapers 데이터가 있습니다. current row보다 이틀 before에 인쇄된 newspapers의 평균과 하루 after에 인쇄된 newspapers의 평균을 알고 싶습니다. 또한 current date와 그보다 three days before에 인쇄된 newspapers 수의 최댓값과 최솟값의 차이도 알고 싶습니다. 이 열을 각각 avg_newspapers 및 diff_newspapers라고 지정하세요.
직접 해보기
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.
기초의 모든 레슨
직접 연습해 보세요: SQL 플레이그라운드