오늘은 프로그래머스에서 SQL 고득점 Kit 를 풀어보고자 합니다.
- 첫번째 문제입니다.
SELECT ANIMAL_TYPE, IFNULL(NAME, 'No name') As NAME, SEX_UPON_INTAKE FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC;
- 두번째 문제입니다.
SELECT A.ANIMAL_ID AS ANIMAL_ID, A.NAME AS NAME FROM ANIMAL_OUTS AS A WHERE A.ANIMAL_ID NOT IN (SELECT B.ANIMAL_ID FROM ANIMAL_INS AS B) ANIMAL_ID
JOIN 을 안쓰고 NOT EXIST 문법으로 해결해보았다
문제가 JOIN에 관련되어 있으니 다시 JOIN문법으로 풀어본다.
SELECT A.ANIMAL_ID, A.NAME FROM ANIMAL_OUTS A LEFT OUTER JOIN ANIMAL_INS B ON A.ANIMAL_ID = B.ANIMAL_ID WHERE B.ANIMAL_ID IS NULL ORDER BY A.ANIMAL_ID ASC;
SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS INS JOIN ANIMAL_OUTS OUTS ON(INS.ANIMAL_ID = OUTS.ANIMAL_ID) WHERE INS.DATETIME>OUTS.DATETIME ORDER BY INS.DATETIME
TIMESTAMP를 사용해보았다.
요지는 DATEDIFF가 잘 되지 않아 해결해본 방식이다.
SELECT in1.ANIMAL_ID, in1.NAME FROM ANIMAL_INS AS in1 LEFT OUTER JOIN ANIMAL_OUTS AS out1 ON in1.ANIMAL_ID = out1.ANIMAL_ID WHERE TIMESTAMPDIFF(SECOND,out1.DATETIME,in1.DATETIME) > 0 GROUP BY ANIMAL_ID ORDER BY in1.DATETIME ASC;
TIMESTAMPDIFF
TIMESTAMPDIFF(단위, 날짜1, 날짜2);
단위
SELECT INS.NAME, INS.DATETIME FROM ANIMAL_INS INS LEFT OUTER JOIN ANIMAL_OUTS OUTS ON OUTS.ANIMAL_ID = INS.ANIMAL_ID WHERE OUTS.ANIMAL_ID IS NULL ORDER BY INS.DATETIME ASC LIMIT 3
LEFT OUTER JOIN문제에서 LIMIT을 추가한 방식이다.
- 네번째 문제입니다.
SELECT INS.ANIMAL_ID, INS.ANIMAL_TYPE, INS.NAME FROM ANIMAL_INS INS JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID WHERE INS.SEX_UPON_INTAKE LIKE 'Intact%' AND (OUTS.SEX_UPON_OUTCOME = 'Spayed Female' OR OUTS.SEX_UPON_OUTCOME = 'Neutered Male') ORDER BY ANIMAL_ID
LIKE 문법과 AND ( OR ) 사용을 활용해 풀어보았다.
- 다섯번째 문제입니다.
SELECT ANIMAL_ID, NAME, CASE WHEN (SEX_UPON_INTAKE LIKE 'Neutered%' OR SEX_UPON_INTAKE LIKE 'Sprayed%') THEN '0' ELSE 'X' END AS '중성화' FROM ANIMAL_INS ORDER BY ANIMAL_ID ASC
CASE WHEN, LIKE, %를 적절하게 사용해서 만들면 된다.
- 여섯번째 문제
SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS INS JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID ORDER BY TIMESTAMPDIFF(SECOND, INS.DATETIME, OUTS.DATETIME) DESC LIMIT 2
TIMEDIFF 혹은 TIMESTAMPDIFF 혹은 ORDER BY 연산 (-)를 사용해서 풀 수 있다. 심플한게 짱이다..
SELECT INS.ANIMAL_ID, INS.NAME FROM ANIMAL_INS INS JOIN ANIMAL_OUTS OUTS ON INS.ANIMAL_ID = OUTS.ANIMAL_ID ORDER BY OUTS.DATETIME - INS.DATETIME DESC LIMIT 2
마지막 문제는 date_format(datetime, ‘%Y-%m-%d’) 관련된 문제였다. 사실 프로그래머스를 하면서 현업에서 가장 많이 사용하는 유형은 DATE과 IS NULL 그리고 DATE(date_format)이였다.