WINDOW절의 범위를 고정으로 줄수있나요? 0 4 5,048

by 신고의추 [Oracle 기초] ORACLE WINDOW함수 WINDOW절 [2015.12.17 09:51:45]


안녕하세요

질문을 하루 1개씩 하는거 같은데.. 쓸데없어 보이지만 궁금해서 다음으로 넘어갈 수가 없네요.

 

SELECT emp_name, depart_id, salary
      ,SUM(salary) OVER(PARTITION BY depart_id ORDER BY salary
                        ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) total
      ,SUM(salary) OVER(PARTITION BY depart_id ORDER BY salary
                        ROWS BETWEEN 1 PRECEDING AND 3 FOLLOWING) BB       
FROM test_emp
WHERE depart_id = 410;

위의 쿼리문은 맨앞/맨끝, 현재ROW에서 value만큼 앞/뒤의 범위가 지정이 되던데

그룹의 ROW 또는 RANGE의 범위를 고정으로 줄수는 없나요?

예를 들면, 그룹의 3번째 ROW부터 6번째 ROW 까지의 등수를 구하고싶습니다.

1,2번째와 7번째부터의 ROW의 결과에는 NULL이 나와도 상관이 없습니다.

그럴 경우 WINDOW절을 약간 수정하는 것만으로 가능한가요?

이것저것 해보니 문법이 안맞아서 그런거 같더군요.

방법이 있으면 RANGE에도 써먹을 수 있을꺼같은데 ..

서브쿼리를 사용안하고 원하는 결과값을 뽑아내고 싶습니다.

 

그리고 BETWEEN절을 생략하였을 때 UNBOUNDE PRECEDING/CURRENT ROW/value PRECEDING

밖에 못쓰는데 이 경우도 현재로우 기준으로 이전으로만 가던데, 반대로 다음으로는 설정못하는건가요?

value가 음수이거나 FOLLOWING는 문법에 안맞아서 안되는거 같네요.

 

질문1) WINDOW절에서 고정 범위를 주는법

질문2) WINDOW절의 BETWEEN미사용시 다음 ROW쪽으로 범위로 설정하는법

 

글 작성하다보니 가끔 키가 두번눌리는 버그가 있네요.

ㅇ이렇게 말이죠.. 또 발생했네요. 특수문자 이후 엔터했을때 이런경우같은데 확실한 조건을 모르네요.

날씨가 갑자기 엄청 추워졌네요. 감기 조심하세요 ~

by 마농 [2015.12.17 10:07:49]

질문1) WINDOW절에서 고정 범위를 주는법
  ROWs 대신 RANGE 사용 가능합니다.
  다만 RANGE 사용하려면 정렬항목에 수치나 날짜가 와야 하는데
  위의 요구사항대로라면 그룹별 순번이 와야 하겠네요.
  그룹별 순번을 구하려면 어차피 분서함수 사용해야 하고
  분석함수는 중첩사용이 안되므로 인라인뷰 사용해야 합니다.
  그런데 요구사항을 다시 살펴보면 ROW_NUMBER 와 DECODE 문으로 충분히 가능한 상황인듯 보이네요.
  그리고 순위를 구한다고 하셨는데요.
  순위함수에서는 WINDOW 구문 사용 못합니다.


질문2) WINDOW절의 BETWEEN미사용시 다음 ROW쪽으로 범위로 설정하는법
 - 안되는 듯. 그냥 문법대로.


by 신고의추 [2015.12.17 10:32:48]

오늘도 답변 감사합니다

저는 ROWS의 고정 ROW수만이 아닌 RANGE의 고정 범위도 주고싶었습니다.

ex) 그룹에서 salary가 3000~10000 인 멤버들만의 순위 .  이런식으로요

RANGE도 결국 현재로우 기준으로 들어가더라구요.

ROWS에서 고정을 주는것을 RANGE형식으로만 바꾸면 되지 않을까 했었습니다

문법상 WINDOW절을 수정하는것만으로는 안되나보네요.

이것으로 기본 쿼리는 끝났고 PL/SQL로 넘어갈수있겠네요 !


by 마농 [2015.12.17 11:01:00]

급여합계의 범위를 한정하여 순위를 구하는 것은
위에서도 언급했듯이 CASE 문으로 범위 지정하여 가능합니다.
 CASE WHEN salary BETWEEN 3000 AND 10000
 THEN RANK() OVER(PARTITION BY depart_id
      ORDER BY CASE WHEN salary BETWEEN 3000 AND 10000 THEN salary ELSE 0 END DESC)
  END rk


by 신고의추 [2015.12.17 11:11:22]

CASE문을 저렇게 사용하면 되는거였네요.  감사합니다.

이번에는 WINDOW절에 연연하다보니 답을 찾지 못했었네요.

곧 점심시간인데 식사 맛있게하세요 !

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