SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_오랜 기간 보호한 동물(2)

SQL공부 2024. 2. 22. 18:33
반응형

SELECT a.ANIMAL_ID, a.NAME
FROM (SELECT o.ANIMAL_ID, o.NAME,datediff(o.DATETIME,i.DATETIME)+1 as datediff 
      from ANIMAL_INS as i, ANIMAL_OUTS as o
      where i.ANIMAL_ID=o.ANIMAL_ID
      order by 3 desc
      limit 2
      ) a

문제

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

 

 순서는 보호기간 (입양일 - 보호소들어온 날짜)이 가장 긴 동물 두마리의 데이터를 조회하는 쿼리이다. 정렬은 해당데이터로 해야하는데 해당데이터는 쿼리에 보여선 안된다.. 그런 경우에는 서브쿼리를 이용하여 값을 만든 뒤 필요한 컬럼만 소환한다. 효율적인 방법의 여부는 잘 모르겠으나.. 생각나는 방법이 그것뿐이라 이렇게 풀었다. datediff를 이용해서 일단 보호기간을 구해준다. 사실 보호기간은 +1 해서 값을 구하는게 정확하지만 사실 큰 의미가없다. 추출할 데이터에 나올 값은 아니기 때문이다. 하지만 일할 때 행여 쿼리를 종종 수정해야 할 경우가 있으므로 미리미리 정확하게 해 두는것을 추천한다.. (나중에가면 왜 이렇게 짰는지 해석하기도  어렵다.)

 

 어쩃건 그러고 datediff 걸어둔 값을 값이 큰순서로 정렬 (desc) 하고 상위 2개값을 limit 한다. ORACLE 공부도 겸하고 있어서 ROWNUM <=2를 해보았지만 안먹혀서 아.. MySQL은 limit 를 써야하는구나 하면서 넘어갔다. 어쨋건 그렇게 서브쿼리를 짜주고 메인쿼리에서 필요한 컬럼만 추출해 주면 끝이다.

 

+ 추가적인 방법으로 서브쿼리를 쓰지않고 order by 절에서 datediff 를 사용하여 값을 구해도 상관없다.

반응형