데이터 분석/SQL

[day17] 졌잘싸.............

경 민 2025. 3. 5. 20:14
더보기

👩🏻‍💻  TODAY I LEARN

1. SQLD 시험 준비 ! 헷갈리는 개념들 정리

2. 어제 못 푼 코드카타 74번 타파하기

3. 파이썬 종합반 1주차 수강

1.  SQLD 시험 준비 ! 헷갈리는 개념들 정리

https://rosenps3.tistory.com/35

 

문제를 풀 때마다 새로운 게 생긴다 . 포스팅 하나로 정리해두고 마지막 날 훑을 예정


2.  어제 못 푼 코드카타 74번 타파하기

Q. 조건을 모두 만족하는 car_id , car_type, 총대여료(FEE) 리스트 뽑아라.

조건 1. car_type이 '세단' 혹은  'suv'

조건 2. 2022년 11월 한 달동안 대여할 거임

조건 3. 총 대여료가 50만원 이상, 200만원 미만

정렬 기준: FEE desc, car_type asc, car_id desc


어제 6시부터 8시 다 되어서까지 풀다가 일단 접어둔 문제.

아니 여태 푼 것보다 어려운 건 맞는데 또 이렇게까지 오래걸릴 일은 아닐 거 같은 느낌이 들어..

그래서 더 속 상 해 . . . .

난 정말 바본가 

이 길은 내 길이 아닌가 . . . . ..................

 

끝도 없는 자기검열과 자존감 바닥의 굴레에 빠지게 됨

그래서 깔 - 끔하게 멈췄다.


무작정 다른 분들 쿼리 보거나 구글링 하는 것보다

혼자서 논리적으로 그리고 차근차근 생각해보는 연습이 더 중요하니까..

 

.

.

.

 

^ ^

 

그래서 오늘은 이거 하나만 풀어도 성공이다 하는 마음으로 풀었다.

결과는 다행히 성공 !


 

  • 내가 만든 쿼리

방법1. 조인 2번하고 따로 조건 주기

SELECT DISTINCT A.CAR_ID
        ,A.CAR_TYPE
        ,FLOOR(A.DAILY_FEE * (1-(A.DISCOUNT_RATE/100))) * 30 AS FEE
FROM
(
	SELECT C.CAR_ID
        	,C.CAR_TYPE
        	,C.DAILY_FEE
        	,D.DISCOUNT_RATE
	FROM CAR_RENTAL_COMPANY_CAR C
	INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
	ON C.CAR_TYPE = D.CAR_TYPE
	WHERE C.CAR_TYPE IN ('세단','SUV')
	AND D.DURATION_TYPE = '30일 이상'
) A
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON A.CAR_ID = H.CAR_ID
WHERE A.CAR_ID NOT IN
	(SELECT CAR_ID
	FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
	WHERE END_DATE >= '2022-11-01' AND START_DATE <= '2022-11-30')
HAVING FEE >= 500000 AND FEE < 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC

 

⭐️ 막혔던 부분

1️⃣ 2022-11-01 ~ 2022-11-30 총 30일동안 대여 가능한 자동차를 뽑기 위한 조건

NOT IN 을 활용해서 저 기간동안 대여 예정인 자동차를 제외하는 게 더 깔끔하다.

그리고 그 조건은

대여일이 내가 반납하려는 날짜보다 앞이고 (START_DATE <= '2022-11-30')

AND

반납일이 내가 대여하려는 날짜보다 뒤일 때 (END_DATE >= '2022-11-01')

라는 것..

 

알고 보면 참 쉬운데 처음 접하면 어떻게 조건을 주어야 할지 아직 막막하다.

이런 문제들을 더 많이 풀어보면서 계속 사고해줘야 할 것 같다.

 

2️⃣ 테이블 A와 history 테이블을 left join ? inner join ??

대여기록이 없는 자동차도 당연히 대여할 수 있으니까 left 가 맞는 것 같은데.. 

혹시 몰라서 튜터님께 질문드렸더니

맞다고 하셨다. 논리적으로 잘 풀었다고 하셨다....

나 잘 하고 있구나..! 다행이댜 ....

 

 

그리고 튜터님이라면 어떻게 푸셨을지 궁금해서 질문드렸다.

  • 튜터님 쿼리

방법2. 조인이 필요한 테이블만 조인. 조건은 한 번에.

SELECT 
    c.CAR_ID, 
    c.CAR_TYPE, 
    FLOOR(c.DAILY_FEE * (1 - d.DISCOUNT_RATE/100) * 30) AS FEE
FROM 
    CAR_RENTAL_COMPANY_CAR c
JOIN 
    CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON c.CAR_TYPE = d.CAR_TYPE
WHERE 
    c.CAR_TYPE IN ('세단', 'SUV') 
    AND d.DURATION_TYPE = '30일 이상'
    AND c.CAR_ID NOT IN (
        SELECT CAR_ID 
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE END_DATE >= '2022-11-01' AND START_DATE <= '2022-11-30'
    )
HAVING 
    FEE BETWEEN 500000 AND 1999999
ORDER BY 
    FEE DESC, 
    c.CAR_TYPE ASC, 
    c.CAR_ID DESC;

어쩜 이렇게 깔끔하게 만드셨을까 ,, 따라해야지

"1. 일단 car 테이블과 discount 테이블 조인해주고

(=자동차마다 할인율을 알 수 있는 테이블을 만들어주고)

2. 그 안에서 

세단 혹은 SUV 인 자동차를 30일 이상 빌렸을 때의 값만 필터링한 다음

3. 최종 대여료를 조건에 맞게 필터링 해라."

 

HISTORY 테이블을 조인할 필요가 없었다.

조건도 한 번에 주면 된다.

내 쿼리보다 훨씬 직관적이고, 간결하다. 정말 많이 배웠다.. !

 

 

이렇게 하나의 문제에도 다양한 접근 방식이 있다는 걸 많이 마주하면서

여러 개의 문을 하나하나 열어가는 느낌이 든다 , , ,

 

이제 문 그만.. 이었으면 좋겠다가도 보이면 열 수밖에 없다 ㅎ

무서워하지 말고 차근하게 문을 열어가보자.

하면 된다.


3. 파이썬 종합반 1주차 수강

코드카타 74번 확실하게 정리하고,

75번 풀다가 또 막혔다 ㅋ

오늘은 75번 고민하는 걸로 남은 시간을 채워보기로 했다.

내일은 정말 파이썬 시작해야지..