개인공부/알고리즘

프로그래머스 - 입양 시각 구하기(2) SQL

KEEMSY 2023. 8. 6. 22:14

 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

나는 이 문제는 입양시간이 존재하지 않을 경우, 0으로 집계하는 것이 핵심이 될 것이라고 생각했다.

 

그러나 아직 부족한 실력때문에 혼자서 해결하지 못하고, GPT의 도움을 받았다.

 

WITH RECURSIVE AllHours AS (
  SELECT 0 AS HOUR
  UNION ALL
  SELECT HOUR + 1 AS HOUR
  FROM AllHours
  WHERE HOUR < 23
)

SELECT 
  AllHours.HOUR,
  COUNT(ANIMAL_OUTS.DATETIME) AS COUNT
FROM AllHours
LEFT JOIN ANIMAL_OUTS ON AllHours.HOUR = HOUR(ANIMAL_OUTS.DATETIME)
GROUP BY AllHours.HOUR
ORDER BY AllHours.HOUR;

GPT는 0~23까지의 모든 시간이 포함된 테이블을 생성하고, JOIN 을 통해 각 시간에 대한 집계를 진행했다. 나는 테이블을 새로 만들 생각을 못했는데, 새로운 방법을 새로 알수 있었다.

 


CTE(Common Table Expression)

 

이렇게 임시 테이블을 만드는 것을 CTE(Common Table Expression) 이라고 한다. CTE 는 SELECT, INSERT, UPDATE 또는 DELETE 문 내에서 참조할 수 있는 SQL의 임시 결과 집합 을 의미한다. 이를 활용하면 쿼리를 단순화 할 수 있으며, SQL 코드를 더욱 쉽게 유지하고 이해할 수 있도록 도움이 된다고 한다.

 

WITH CTE_Name (Column1, Column2, ...) AS (
    -- SQL query that defines the CTE
)

 

  • WITH: 이 키워드는 CTE 정의를 시작하는 데 사용된다.
  • CTE_Name: CTE에 부여된 이름으로서, 임시 결과 집합의 별칭 역할을 하고 나중에 메인 쿼리에서 참조할 수 있다.
  • (Column1, Column2, ...): 선택 사항으로, 이 부분은 CTE에서 사용할 수 있는 열 이름을 지정한다. 지정하지 않으면 CTE를 정의하는 데 사용된 SQL 쿼리에서 열 이름이 유추된다.
  • AS: CTE의 SQL 쿼리 정의의 시작 부분을 나타낸다.
  • -- SQL query that defines the CTE: 임시 결과 집합을 생성하는 실제 SQL 쿼리이다. SELECT, INSERT, UPDATE 또는 DELETE 문이 될 수 있다.

728x90