녕녀기의 실험일지

[ Oracle ] FETCH를 사용한 상위 3개 날짜 추출 본문

-- Data --/- SQL -

[ Oracle ] FETCH를 사용한 상위 3개 날짜 추출

녕녀기 2023. 8. 16. 11:27

본문으로

안녕하세요. 녀기입니다.

 

이번에는 좀 빨리 돌아오지 않았나요?ㅋㅋㅋㅋ

 

중간에 연휴가 살~~짝 껴있었기 때문에

 

금방 돌아왔습니다!!

 

(사실 완전 쉬는 것도 아니었습니다...

 

데이콘 하느라 이것저것 바빴어요ㅠㅠ

 

😱)

 

오늘도 SQL을 만져 보던 중

 

제가 한 것보다 더 간단하게 코드를 작성하는 법이 있어

 

그것을 기록해 놓을까 합니다!!

 

그럼 들어가 보시죠!


↓ 문제 출처는 아래

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

↓ 참고한 블로그도 아래

https://rimkongs.tistory.com/158

 

[Oracle] FETCH 구문 사용하기

Oracle 12c release부터 사용할 수 있는 구문이다. 다음과 같이 다대일 관계를 형성하고 있는 INVENTORIES 와 PRODUCTS 테이블을 보자 quantity 컬럼에 대해 top-5를 리턴해준다. SELECT product_name, quantity FROM invento

rimkongs.tistory.com

 

처음 제가 작성한 코드입니다.

 

서브 쿼리와 RANK를 이용해서 오래된 날짜 상위 3개를 추출했습니다.

WITH DATE_RANK AS (
     SELECT AI.ANIMAL_ID, 
     RANK() OVER (ORDER BY AI.DATETIME) AS RANK
    
     FROM ANIMAL_INS AI LEFT OUTER JOIN ANIMAL_OUTS AO
     ON AI.ANIMAL_ID = AO.ANIMAL_ID
     WHERE AO.ANIMAL_ID IS NULL
                     )

SELECT AI.NAME, AI.DATETIME
FROM ANIMAL_INS AI INNER JOIN DATE_RANK DR
ON AI.ANIMAL_ID = DR.ANIMAL_ID
WHERE DR.RANK <= 3
ORDER BY AI.DATETIME
;

 

저렇게 되면 코드가 길어지죠.

 

그래서 FETCH 구문을 사용해 코드를 줄여봅시다.

SELECT AI.NAME, AI.DATETIME
FROM ANIMAL_INS AI LEFT OUTER JOIN ANIMAL_OUTS AO
ON AI.ANIMAL_ID = AO.ANIMAL_ID
WHERE AO.ANIMAL_ID IS NULL 
ORDER BY AI.DATETIME
FETCH NEXT 3 ROWS ONLY
;

AI.DATETIME에 대해서 오름차순으로 정렬을 했습니다.

 

FETCH를 사용해서 정렬된 테이블의 상위 3개 데이터를 추출합니다.

 

  • ONLY를 사용하면 상위 3개만 딱 출력하고
  • WITH TIES를 사용하면 마지막에 출력되는 행과 값이 동일한 행도 같이 출력합니다.

    만약

    FETCH NEXT 3 ROWS WITH TIES

    로 쿼리문을 작성하고

    3번째로 출력되는 행과 값이 동일한 데이터가 2개 더 있다면,

    3 + 2 = 5

    5개의 행이 출력됩니다.

저는 ONLY를 사용했기에 3개의 행만 출력되죠.


코테를 연습하면서 좋은 점은

 

다른 사람의 코드를 볼 수 있는 점이 좋은 것 같습니다.

 

저보다 잘하시는 분들 것을 보고 더 나은 코드를 작성할 수 있게 되지 않나 싶네요ㅎㅎ

 

그럼 저는 다시 도망가 보도록 하겠습니다~~

 

다음에 봐용!

Comments