노력에는 지름길이 없으니까요

프로그래머스 - 배열 만들기 1 본문

SQL/프로그래머스

프로그래머스 - 배열 만들기 1

데건 2024. 7. 12. 16:49
728x90

 

해결일 언어 레벨 테스트명
20240712 SQL level 3  배열 만들기 1

 

링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151139#qna

다소 길어서 아랫부분은 생략

 

 


 

내 코드

SELECT
    MONTH(START_DATE) MONTH
    ,CAR_ID
    ,COUNT(1) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE 1=1
AND MONTH(START_DATE) BETWEEN 8 AND 10 #이 부분에서 조금 헤맸다
AND CAR_ID IN (SELECT
                    CAR_ID
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                WHERE YEAR(START_DATE) = 2022
                AND MONTH(START_DATE) BETWEEN 8 AND 10
                GROUP BY 1
                HAVING COUNT(*) >= 5)
GROUP BY 1,2
HAVING RECORDS != 0
ORDER BY 1, 2 DESC

 

 

 

개선점:

START_DATE가 8월과 10월 사이 COUNT가 5 이상인 CAR_ID를 출력하는 서브쿼리와

그 중에서 또 START_DATE가 8월과 10월 사이의 개수를 출력하는 쿼리를 짜야하기 때문에

양쪽 다 날짜 조건이 포함되어야 하는데...

그걸 놓쳐서 시간을 조금 오래 썼다

 

베스트 코드

WITH HIST AS (
    SELECT CAR_ID, HISTORY_ID, MONTH(START_DATE) MONTH
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE YEAR(START_DATE) = 2022 
    AND MONTH(START_DATE) BETWEEN '08' AND '10'
), HIST_LIMIT AS (
    SELECT CAR_ID
    FROM HIST
    GROUP BY CAR_ID
    HAVING COUNT(HISTORY_ID) >= 5
)
SELECT MONTH, CAR_ID, COUNT(HISTORY_ID) RECORDS
FROM HIST
WHERE CAR_ID IN (SELECT CAR_ID FROM HIST_LIMIT)
GROUP BY MONTH, CAR_ID 
HAVING COUNT(HISTORY_ID) > 0
ORDER BY MONTH, CAR_ID DESC;

 

WITH로 일시적 테이블을 만들 때 2개 이상을 만들고 싶으면 위의 방법을 사용하면 될 것 같다.

참고하고 싶어서 가져왔다.

 

 

 

728x90
반응형