본문 바로가기
Language/DB

[Programmers | SQL | String, Date 문제 풀이] 오랜 기간 보호한 동물(2) - Solution with JOIN & 날짜 차이 & 상위 N개 인스턴스 조회

by ㅇ달빛천사ㅇ 2024. 7. 2.
728x90

KDT 실무형 스프링 백엔드 엔지니어 양성과정 6기 | SQL CODEKATA

🐱 오랜 기간 보호한 동물(2)

🏷 관련 주제 : JOIN 날짜 차이 DATEDIFF 상위 N개 인스턴스 ROWNUM LIMIT




✔️ (Oracle) Solution with JOIN & ROUND() & ROWNUM

SELECT * 
FROM(SELECT I.ANIMAL_ID
	        , I.NAME
     FROM ANIMAL_INS I
          , ANIMAL_OUTS O
     WHERE I.ANIMAL_ID = O.ANIMAL_ID
     ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC)
WHERE ROWNUM <= 2;
실행 결과

✔️ (MySQL) Solution with JOIN & DATEDIFF & LIMIT

SELECT I.ANIMAL_ID
	   , I.NAME
FROM ANIMAL_INS I
     , ANIMAL_OUTS O
WHERE I.ANIMAL_ID = O.ANIMAL_ID
ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC
LIMIT 2;
실행 결과

💥 오늘 만난 문제 & 나의 시도 💦 & 해결 방법 👍

📌 오늘 만난 문제 : 입양을 간 동물 중, 보호 기간이 가장 길었던 동물 두 마리의 아이디와 이름을 조회하는 SQL문을 작성해주세요. 이때 결과는 보호 기간이 긴 순으로 조회해야 합니다.


1. ANIMAL_INS 테이블과 ANIMAL_OUTS 테이블을 ANIMAL_IDJOIN하여 동물의 아이디, 이름, 보호 시작일, 입양일, 보호 기간을 조회하자.

MySQL : DATEDIFF() 이용
Oracle : TRUNC() 이용
"보호 기간" 별칭 주기
같은 날 보호 시작 및 입양이 되었다면 보호기간은 1일이므로, (입양일과 보호 시작일의 차) +1

  • Oracle & MySQL
    SELECT I.ANIMAL_ID
    	   , I.NAME
           , I.DATETIME
           , O.DATETIME
           , ROUND(O.DATETIME - I.DATETIME + 1) "보호기간"
    FROM ANIMAL_INS I
         , ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID;
    실행 결과

  • MySQL
    SELECT I.ANIMAL_ID
    	   , I.NAME
           , I.DATETIME
           , O.DATETIME
           , DATEDIFF(O.DATETIME, I.DATETIME) + 1 "보호기간"
    FROM ANIMAL_INS I
         , ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID;
    실행 결과

2. 보호기간을 기준으로 내림차순 정렬하여 동물의 아이디, 이름, 보호기간을 조회하자.

  • Oracle & MySQL
    SELECT I.ANIMAL_ID
    	   , I.NAME
           , ROUND(O.DATETIME - I.DATETIME + 1) "보호기간"
    FROM ANIMAL_INS I
         , ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID
    ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC;
    실행 결과

  • MySQL
    SELECT I.ANIMAL_ID
    	   , I.NAME
           , DATEDIFF(O.DATETIME, I.DATETIME) + 1 "보호기간"
    FROM ANIMAL_INS I
         , ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID
    ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC;
    실행 결과

3. 위의 조회 결과에서 상위 2개의 인스턴스의 동물의 아이디이름을 조회하자.

상위 N개 인스턴스 조회하기
Oracle : ROWNUM <= N
MySQL : LIMIT N
  • Oracle
    SELECT * 
    FROM(SELECT I.ANIMAL_ID
    	        , I.NAME
         FROM ANIMAL_INS I
              , ANIMAL_OUTS O
         WHERE I.ANIMAL_ID = O.ANIMAL_ID
         ORDER BY ROUND(O.DATETIME - I.DATETIME + 1) DESC)
    WHERE ROWNUM <= 2;
    실행 결과

  • MySQL
    SELECT I.ANIMAL_ID
    	   , I.NAME
    FROM ANIMAL_INS I
         , ANIMAL_OUTS O
    WHERE I.ANIMAL_ID = O.ANIMAL_ID
    ORDER BY DATEDIFF(O.DATETIME, I.DATETIME) + 1 DESC
    LIMIT 2;
    실행 결과



💬 무엇을 새롭게 알았는지

  • 두 테이블을 JOIN 을 해보았다.
  • 두 날짜의 차이 구하기
    • MySQL : DATEDIFF()
    • Oracle : ROUND(날짜1 - 날짜2) 또는 TRUNC(날짜1 - 날짜2)
  • 상위 N개 인스턴스 조회하기
    • MySQL : LIMIT N
    • Oracle : 조회하고자하는 쿼리를 FROM절에 서브쿼리로 주고 WHERE ROWNUM <= N

📚 References(참고 자료)







728x90