[mysql/oracle] 오랜 기간 보호한 동물(2)

2023. 7. 27. 18:52Programmers/SQL

문제 설명

 

문제

 

결과

 

mysql 1

1
2
3
4
5
6
7
8
9
SELECT ANIMAL_ID, NAME
FROM (
    SELECT A.ANIMAL_ID, A.NAME, 
           RANK() OVER(ORDER BY B.DATETIME - A.DATETIME DESC) AS PERIOD
    FROM ANIMAL_INS A, ANIMAL_OUTS B
    WHERE A.ANIMAL_ID = B.ANIMAL_ID
    ORDER BY PERIOD
    ) a
WHERE PERIOD IN (1,2)
cs

: mysql은 서브쿼리에 alias 필수!

 

oracle 1

1
2
3
4
5
6
7
8
9
SELECT ANIMAL_ID, NAME
FROM (
    SELECT A.ANIMAL_ID, A.NAME, 
           RANK() OVER(ORDER BY B.DATETIME - A.DATETIME DESC) AS PERIOD
    FROM ANIMAL_INS A, ANIMAL_OUTS B
    WHERE A.ANIMAL_ID = B.ANIMAL_ID
    ORDER BY PERIOD
    )
WHERE PERIOD IN (1,2)
cs

 

오랜기간 보호한 동물을 뽑는 것이기 때문에 

(입양 간 날짜 - 보호시작한 날짜)를 계산해서 rank로 줄 세운다 → DATE 타입끼리는 기본적인 연산 가능 

그리고 1, 2위 기간으로 조건을 걸면 된다.

 

 

mysql2

1
2
3
4
5
SELECT A.ANIMAL_ID, A.NAME
FROM ANIMAL_INS A, ANIMAL_OUTS B
WHERE A.ANIMAL_ID = B.ANIMAL_ID
ORDER BY B.DATETIME - A.DATETIME DESC
LIMIT 2
cs

: mysql에서는 LIMIT으로 출력할 row의 수를 정할 수 있다.

 

oracle2

1
2
3
4
5
6
7
SELECT ANIMAL_ID, NAME
FROM (SELECT A.ANIMAL_ID, A.NAME
      FROM ANIMAL_INS A, ANIMAL_OUTS B
      WHERE A.ANIMAL_ID = B.ANIMAL_ID
      ORDER BY B.DATETIME - A.DATETIME DESC
     ) 
WHERE ROWNUM < 3
cs