세조목

SQL정리(max함수)(24.01.05)(업데이트 예정) 본문

데이터 분석 공부/SQL

SQL정리(max함수)(24.01.05)(업데이트 예정)

세조목 2024. 1. 5. 21:22

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

프로그래머스 59번 예제를 복습하던 중

이해가 되지 않는 부분이 있었다.

MAX(IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', '대여중', '대여 가능')) AVAILABILITY

이 부분인데 문제의 요구사항대로 2022년 10월 16일에 대여 중인 CAR_ID를 선택하기위해

IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', '대여중', '대여 가능')이라는 조건을 걸었다.

이렇게 했을때 하나의 CAR_ID에 여러 개의 대여 기록이 있기때문에 DATE들이 여러개가 조회되는데

우리는 가장 최근의 대여 기록을 알고자 하는것이므로 가장 큰 날짜(=가장 최근의 날짜)를 구하기위해

MAX함수를 씌워주었다.

 

그런데 이렇게 했을때의 문제는 MAX를 씌웠음에도 불구하고 DATE가 최근의 DATE가 조회되지 않는다는 점이었다.

아래 이미지는 MAX함수를 씌우기 전에 조회한 결과값인데 CAR_ID가 29인 속성값들 중에서 2022년 11월 29일이 가장 최근의 대여 기록인 것을 확인할 수 있다.

 

그런데 MAX함수를 씌웠을때의 결과값을 보면 2022년 8월 5일이 가장 최근의 날짜로 나온 것을 확인할 수 있다.

 

'문제가 잘못됐나' 싶었는데

문제가 잘못된건 아니고,

IF의 결과값에 MAX를 씌웠다는 것을 노치고 있던 것이었다.

무슨 말이냐하면

IF(START_DATE <= '2022-10-16' AND END_DATE >= '2022-10-16', '대여중', '대여 가능')

IF문의 결과값은 '대여중'이거나 '대여 가능'으로 나올 것이다.

'대여중'과 '대여 가능'에 MAX를 거는건데

'대여중'과 '대여 가능'은 TRUE or FALSE로 1 or 0이다.

1과 0 중에서 가장 큰 값은 1이기때문에

'대여중'이 하나라도 섞여있는 CAR_ID의 경우 AVAILABILITY 컬럼에 '대여 중'인 레코드가 조회될 것이다.

 

그런데... 그럼에도 불구하고 아직도 의문점이 남는다...

'대여중'이 TRUE값으로 1이니까 MAX씌웠을때 이 레코드가 조회돼야하는데

최종 결과값을 보면 AVAILABILITY에는 '대여중'이라고 출려돼있으나

START_DATE와 END_DATE를 보면 여전히 가장 오래된 대여 일자가 출력된다.

이 부분에 대해서는 왜 저렇게 출력이 되는지 조금 더 고민을 해보고 포스팅을 업데이트하도록하겠다.

 

일단 오늘 새롭게 학습한건

IF문에 MAX를 씌웠을때는 IF의 결과값이 숫자가 아닌 TRUE or FALSE라면 1과 0을 가지고서 MAX값을 구한다는 점이다.