SQL문 해석 0 3 725

by 날막아봐 [Oracle 기초] [2020.09.02 12:59:25]


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에 의미는 무엇인지 모르겠습니다.

 

by 마농 [2020.09.02 13:37:27]

RANGE/ROWS 에 따라 처리 단위가 달라지고
범위를 지정하는 방법에 따라 계산 범위가 달라집니다.
분석함수에서 계산 범위를 지정하는 방법이 3가지 입니다.
1. RANGE BETWEEN 시작점 AND 종료점 <-- (시작점 ~ 종료점)
2. RANGE 시작점 <-- (시작점 ~ 현재행)
3. 생략 --> (맨처음 ~ 현재행)
그 중 2번 방법이고 시적점을 현재행으로 지정했으니 (현재행 ~ 현재행)의 의미입니다.

여기서 또 RANGE 와 ROWS 의 차이를 알아야 합니다.
ROWS 는 행단위 계산이고 RANGE 는 값단위로 계산됩니다.
ROWS 였다면 현재행 5 에 해당하는 카운트는 1인데
RANGE 이므로 현재행 5 에 해당하는 값 3 의 범위는 3건이 됩니다.

R1 은 알리아스(별칭)입니다. 내려쓰기(엔터)가 되어 있어 헷갈릴 수 있겠네요.


by 날막아봐 [2020.09.02 21:34:44]

답변 정말 감사드립니다. 이게 완전히 이해되지 않아서 추가적으로 확인차 여쭤보자면

count(*) 값이 R1이고 조회된 건수를 도출하는 것이고 범위는 현재행에서 현재행이고

첫 행부터 보면  첫 행만 범위 지정되어 C2 값인 1이 선택되고  C2값 1에 대한 합계(C2 값이 1인 행은 몇개인가?)는 1행 하나라서 R1은 1이 나오고
이런 절차로
다음은 2가 선택되고 2값은 가진 C2값이 2개라서 R1값은 2가 되는 것 맞나요?
이런 범위 계산이 값 단위 계산이라고 칭하고 만약 ROW라면 이 행 하나만을 도출해 1이 답이 나온다.

제가 이해한 것이 맞나요? 머리 속이 복잡하네요..!


by 마농 [2020.09.03 09:13:42]

Exactly.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입