강의로 돌아가기
신기욱

MySql 좀더 좋은 방법이 없을까요..?

-- 코드를 입력하세요
SET @rownum:=-1;

WITH TEMP01 AS (
SELECT DISTINCT @rownum:=@rownum+1 AS ROWNUM
, HOUR(DATETIME)
FROM ANIMALOUTS
LIMIT 24
),
TEMP02 AS (
SELECT HOUR(DATETIME) AS HOUR
, COUNT(*) AS COUNT
FROM ANIMAL
OUTS
GROUP BY HOUR(DATETIME)
)
SELECT A.ROWNUM AS HOUR
, CASE WHEN B.COUNT IS NULL THEN 0
ELSE B.COUNT
END AS COUNT
FROM TEMP01 A
LEFT OUTER JOIN TEMP02 B
ON A.ROWNUM = B.HOUR
ORDER BY A.ROWNUM

이렇게 통과는 했지만 with절을 두개쓴게 마음에 안드네요..

작성중인 코드―solution.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
-- 코드를 입력하세요
SET @rownum:=-1; 

WITH TEMP01 AS ( 
                 SELECT DISTINCT @rownum:=@rownum+1 AS ROWNUM
                      , HOUR(DATETIME)
                   FROM ANIMAL_OUTS
                  LIMIT 24
               ),
TEMP02 AS  (
                 SELECT HOUR(DATETIME) AS HOUR
                      , COUNT(*) AS COUNT
                   FROM ANIMAL_OUTS
                  GROUP BY HOUR(DATETIME)
                )
SELECT A.ROWNUM AS HOUR
     , CASE WHEN B.COUNT IS NULL THEN 0
            ELSE B.COUNT
       END AS COUNT
  FROM TEMP01 A
  LEFT OUTER JOIN TEMP02 B
    ON A.ROWNUM = B.HOUR
 ORDER BY A.ROWNUM
1 개의 답변
Jamie

안녕하세요! 작성하신 statement에서 조금 개선의 여지가 있다고 생각드는 부분은

  1. temp1의 경우는 ANIMAL OUTS와 관련없는 테이블이라서 WITH RECURSIVE로 0~23 컬럼을 독립적인 테이블로 구성하시는게 좋을 것 같구요.(만약 animal_outs의 row가 24개가 안되는 경우에는 취약할 것 같아요)
  2. 그리고 단순하지만 아래 select로 결과 출력하는 부분에서는 조건절을 적지 말고 ISNULL(B.COUNT, 0) 으로 간소화 하면 가독성이 좋아 보여요~
  3. 원하시는 WITH를 덜 쓰는 방식으로 풀이를 하면 아래처럼 코드를 작성할 수 있을 것 같아요.
WITH RECURSIVE
            cte AS 
              ( SELECT 0 AS HOUR
                UNION ALL
                SELECT HOUR + 1
                FROM cte
                WHERE HOUR < 23 )
SELECT      cte.hour, COUNT(ani.ANIMAL_ID)
FROM        cte
LEFT JOIN   ANIMAL_OUTS AS ani
ON          cte.hour = HOUR(ani.DATETIME)
GROUP BY    cte.hour

References:

  1. HOUR() 시간 함수 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html
  2. WITH RECURSIVE 구문 https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions-recursive 도움되셨기를!
  • SUHYANG

    감사합니다. 새로운 구문 알아가요!!!

    SUHYANG―2020.09.04 17:45
  • soccerplayer09

    깔끔히 정리된 정보 공유 감사합니다!~

    soccerplayer09―2020.10.28 00:19
  • 김민지

    와 설명 감사합니다!

    김민지―2020.11.07 20:05
  • 장석현

    감사합니다

    장석현―2022.09.10 17:01
답변 쓰기
이 입력폼은 마크다운 문법을 지원합니다.