본문 바로가기

코딩테스트/SQL - 프로그래머스

SQL 고득점 kit(GROUP BY) - 입양 시각 구하기(2)

 

 

처음에 문제만 읽었을 때엔 아니 띠용? 이렇게 쉬운 문제가 Lv 4? 라고 생각했으나, 예시 답안을 보니 Lv4일만 했다.

기록이 없는 빈 시간대의 데이터도 만들어야 했기 때문이다.

 

참고로 입양 시각 구하기(1) 문제는, 같은 것을 구하되 기록이 없는 빈 시간대는 고려할 필요가 없던 문제였고, Lv2 문제였다. 그래서 간단히 휘리릭 풀었었다.

SELECT HOUR(DATETIME) AS HOUR
     , COUNT(*) AS COUNT
    FROM ANIMAL_OUTS
    GROUP BY HOUR
    ORDER BY HOUR

 

 

 

그런데, 기록 없는 빈 시간대의 데이터도 있어야 한다는 저 조건 하나만으로 Lv이 2단계나 뛴다?

=> 지금까지의 SQL 코테 풀이 짬으로 보아하니, 이건 문가 대단하게 어려운 쿼리를 짜야 풀린다기보단(물론 이런 상황에 맞는 특정 구문이나 함수를 쓰지 않고 구현하려면 당연히 어려울테지만) 뭔가 특정 함수 혹은 구문을 아느냐 모르느냐를 묻는 문제다! 라는 직감이 왔다

=> 그럼 그것이 무엇이냐... 열심히 찾아본 끝에 발견했다.

 

이번에 정말 처음 봤는데, 물론 유용하게 쓰이니까 만들어졌겠지만,  어디에 주로 쓰이는지 궁금했던...

WITH RECURSIVE() 구문

 

재귀 쿼리를 짤 때 사용하는 구문이고, 관련해서 자세한 내용은 따로 포스팅 해 두었으니 해당 글을 참고하길 바란다.

-- 풀이 쿼리
WITH RECURSIVE RC AS (
    SELECT 0 AS HOUR
    UNION ALL
    SELECT HOUR+1
        FROM RC
    WHERE HOUR < 23
)

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

 

 

 

[STUDY/SQL, DB] - [MySQL] WITH RECURSIVE 구문

 

[MySQL] WITH RECURSIVE 구문

SQL에서 재귀 쿼리 짤 때 사용하는 구문이다. 구문 작성하는 방법이 좀 독특한데, 아래와 같다. WITH RECURSIVE cte_count AS ( -- Non-Recursive 문장( 첫번째 루프에서만 실행됨 ) SELECT 1 AS n UNION ALL -- Recursive

k-wien1589.tistory.com