프로그래머스 – 1 SQL 고득점 Kit

오늘은 프로그래머스에서 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);

단위

  • SECOND : 초
  • MINUTE : 분
  • HOUR : 시
  • DAY : 일
  • WEEK : 주
  • MONTH : 월
  • QUARTER : 분기
  • YEAR : 연
  • 세번째 문제입니다.

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)이였다.

Leave a Comment