[SQL 오답] 입양 시각 구하기(2) ( WITH RECURSIVE )

byeol·2023년 4월 28일
0

접근

https://school.programmers.co.kr/learn/courses/30/lessons/59413

이 문제를 통해 두 가지를 배웠습니다.
규칙적으로 값이 늘어나는 새로운 테이블을 만드는 방법
그리고 그룹함수를 통해서 COUNT할 때 COUNT안에 넣는 칼럼에 따라 그 결과가 달라진다는 것입니다.

이 두 가지를 자세히 정리해 보겠습니다.

✅ 첫 번째, 규칙적으로 값이 늘어나는 새로운 테이블을 만드는 방법

WITH RECURSIVE 테이블 AS (
  SELECT 초기시작값 AS 변수명(=칼럼명)
  UNION ALL
  SELECT 변수명에규칙붙이기 FROM 테이블 WHERE 제한조건
)

위와 같은 문법으로 가능합니다.

따라서 제가 푼 입양 시각 구하기(2) 문제에서는 아래와 같이 풀어야 합니다.

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

결과는 아래와 같습니다.

✅ 두 번째, 그룹함수를 통해서 COUNT할 때 COUNT안에 넣는 칼럼에 따라 그 결과가 달라진다는 것입니다.

이 경우는 두 개의 예시를 통해 보여드리겠습니다.

  1. 무엇을 기준으로 셀 것인가? * 별의 의미
# ANIMAL_OUTS : 동물 보호소에서 입양 보낸 동물의 정보
# 0시부터 23시까지
# 각 시간대별로 입양이 몇 건이나 발생했는지를 조회

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

SELECT T.HOUR, COUNT(*) AS COUNT
FROM ANIMAL_OUTS AS A RIGHT OUTER JOIN T ON (HOUR(A.DATETIME)=T.HOUR)
GROUP BY T.HOUR

위와 같이 COUNT(*)은 그룹 안에 존재하는 필드의 수를 셉니다.

  1. 무엇을 기준으로 셀 것인가?
# ANIMAL_OUTS : 동물 보호소에서 입양 보낸 동물의 정보
# 0시부터 23시까지
# 각 시간대별로 입양이 몇 건이나 발생했는지를 조회

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

SELECT T.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS AS A RIGHT OUTER JOIN T ON (HOUR(A.DATETIME)=T.HOUR)
GROUP BY T.HOUR

COUNT(*)은 그룹에 존재하는 필드의 수를 세지만
COUNT(ANIMAL_ID)은 그룹에 존재하는 ANIMAL_ID의 수를 셉니다.
따라서 ANIMAL_ID가 존재하지 않는 경우에는 세지 않습니다!

결과는 아래와 같습니다.

풀이

# ANIMAL_OUTS : 동물 보호소에서 입양 보낸 동물의 정보
# 0시부터 23시까지
# 각 시간대별로 입양이 몇 건이나 발생했는지를 조회

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

SELECT T.HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS AS A RIGHT OUTER JOIN T ON (HOUR(A.DATETIME)=T.HOUR)
GROUP BY T.HOUR
profile
꾸준하게 Ready, Set, Go!

0개의 댓글