C1 C2
1 1
2 2
3 2
4 3
5 3
6 3
이렇게 표가 나오고
SELECT R1
FROM (SELECT A.*, COUNT(*) OVER (ORDER BY C2 RANGE CURRENT ROW)
R1 FROM SQLD_10 A)
WHERE C1=5;
여기서 문제는
주어진 테이블에서 다음 SQL문을 실행했을 때의 결과값을 묻습니다.
저는 인라인 뷰에 쿼리가 해석이 어려운데
제가 아는 부분은
표의 값 전부랑 전체 개수를 표기하는데 그 조건이 C2로 정렬한 후
- 그 다음 RANGE CURRENT ROW로 써있는데 현재 ROW가 범위가 무슨 의미인지 모르겠습니다.
- 그 다음에 R1이 나오는데 이 R1에 의미는 무엇인지 모르겠습니다.
RANGE/ROWS 에 따라 처리 단위가 달라지고
범위를 지정하는 방법에 따라 계산 범위가 달라집니다.
분석함수에서 계산 범위를 지정하는 방법이 3가지 입니다.
1. RANGE BETWEEN 시작점 AND 종료점 <-- (시작점 ~ 종료점)
2. RANGE 시작점 <-- (시작점 ~ 현재행)
3. 생략 --> (맨처음 ~ 현재행)
그 중 2번 방법이고 시적점을 현재행으로 지정했으니 (현재행 ~ 현재행)의 의미입니다.
여기서 또 RANGE 와 ROWS 의 차이를 알아야 합니다.
ROWS 는 행단위 계산이고 RANGE 는 값단위로 계산됩니다.
ROWS 였다면 현재행 5 에 해당하는 카운트는 1인데
RANGE 이므로 현재행 5 에 해당하는 값 3 의 범위는 3건이 됩니다.
R1 은 알리아스(별칭)입니다. 내려쓰기(엔터)가 되어 있어 헷갈릴 수 있겠네요.
답변 정말 감사드립니다. 이게 완전히 이해되지 않아서 추가적으로 확인차 여쭤보자면
count(*) 값이 R1이고 조회된 건수를 도출하는 것이고 범위는 현재행에서 현재행이고
첫 행부터 보면 첫 행만 범위 지정되어 C2 값인 1이 선택되고 C2값 1에 대한 합계(C2 값이 1인 행은 몇개인가?)는 1행 하나라서 R1은 1이 나오고
이런 절차로
다음은 2가 선택되고 2값은 가진 C2값이 2개라서 R1값은 2가 되는 것 맞나요?
이런 범위 계산이 값 단위 계산이라고 칭하고 만약 ROW라면 이 행 하나만을 도출해 1이 답이 나온다.
제가 이해한 것이 맞나요? 머리 속이 복잡하네요..!