들어가며
https://school.programmers.co.kr/learn/courses/30/lessons/157340
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
해당 문제를 푸는데 새롭게 알게 된 것이 있어 그 내용을 정리해보고자 합니다.
SELECT CAR_ID, CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중'
ELSE '대여 가능' END AS 'AVAILBILITY'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
ORDER BY CAR_ID DESC;
| CAR_ID | AVAILIBILITY |
| 1 | 대여중 |
| 대여 가능 | |
| 대여 가능 | |
| 대여 가능 | |
| 2 | 대여 가능 |
| 대여 가능 | |
| 대여 가능 | |
| 대여 가능 |
해당 쿼리문을 통해 AVAILBILITY 열을 만드는데 성공했지만 GROUP BY 했을 때, '대여중' 행이 하나라도 있다면 '대여중'으로 표시되도록 해야하는 과정이 필요했습니다.
| CAR_ID | AVAILIBILITY |
| 1 | 대여중 |
| 2 | 대여 가능 |
GROUP BY시 AVAILIBILITY를 위 표와 같이 바꾸는 방법을 모색해보았습니다.
SUM, EXTRACT, IN 등 다양한 방법이 있었지만 MAX 함수를 사용한다면 효율적으로 쿼리문을 짤 수 있었습니다.
SELECT CAR_ID, MAX(CASE WHEN '2022-10-16' BETWEEN START_DATE AND END_DATE THEN '대여중'
ELSE '대여 가능' END) AS 'AVAILBILITY'
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC;
해당 쿼리문의 핵심은 문자열에도 '대소(정렬) 순서가 존재하여 MAX 함수가 그 순서를 기준으로 가장 큰 값을 고른다는 점입니다.
왜 MAX()가 '대여중'을 고르는가?
문자열의 크기 비교는 문자 정렬 규칙을 따릅니다.
일반적으로 한국어에서는 '대여중' VS '대여 가능'을 비교 시, 같은 문자인 '대여'를 제외하고 같은 자리에 있는 '중' VS ' '(공백)을 비교합니다.
문자 정렬 규칙 상, 공백 < 글자 이므로 '대여중'이 더 큰 문자열로 간주됩니다.
- MAX(['대여 가능', '대여중', '대여 가능']) -> '대여중'
- MAX(['대여 가능', '대여 가능', '대여 가능']) -> '대여 가능'
그래서 해당 예시처럼 그룹 안에 '대여중'이 한 번 이라도 있으면 MAX 함수가 가장 큰 '대여중' 문자 값을 선택하게 됩니다!
'STUDY' 카테고리의 다른 글
| <SQL> ORDER BY 이해하기 - [Programmers] 노선별 평균 역 사이 거리 조회하기 (0) | 2025.10.12 |
|---|---|
| <SQL> IN vs EXISTS - [Programmers] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2025.10.09 |
| 티스토리 글 검색 포털에 노출시키기 (0) | 2025.09.25 |
| <Tableau> 커스텀 도형 사용하기 (0) | 2025.09.24 |
| 티스토리 블로그에 GA4, GTM 연결하기! (0) | 2025.09.15 |
