일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- If
- 서브쿼리
- GA4
- 데이터분석
- 데이터 분석
- Chat GPT
- SQL
- 기초통계
- 최종 프로젝트
- 프롬프트 엔지니어링
- 히트맵
- 군집화
- 클러스터링
- 머신러닝
- cross join
- data analyst
- 기초프로젝트
- SQLD
- 팀프로젝트
- 시각화
- lambda
- jd
- 전처리
- pandas
- 태블로
- 크롤링
- 프로젝트
- da
- streamlit
- Python
- Today
- Total
세조목
TIL(Today I Learned)13일차(23.12.14) 본문
1. SQL
1) 프로그래머스 69번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/151139#qna
# 2022년 8월부터 2022년 10월까지
# 총 대여 횟수가 5회 이상인 자동차
# 월별, 자동차 ID별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력
# 월 기준 오름차순 정렬, 자동차ID 기준 내림차순 정렬
# 대여 횟수 0인 경우는 제외
69번 문제의 요구사항이다.
이 문제의 경우 대여 횟수를 나타내는 컬럼이 없기 때문에 COUNT함수로 횟수를 구해주고
총 대여 횟수가 5회 이상인 자동차를 대상으로 나머지 조건들을 맞춰줘야한다.
SELECT MONTH(START_DATE) MONTH, CAR_ID, COUNT(*) RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN
(
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY CAR_ID
HAVING COUNT(*)>=5
) AND START_DATE BETWEEN '2022-08-01' AND '2022-10-31'
GROUP BY 1, 2
ORDER BY 1, 2 DESC
코드는 위와 같다.
WHERE절에서 서브쿼리를 이용하여 우선 총 대여 횟수가 5회 이상인 자동차들을 걸러내고 AND를 이용하여 8월부터 10월까지의 대여건만을 다시 추려낸다.
그런데 여기서 유의해야할 점은 8월부터 10월까지라는 조건을 서브쿼리 바깥 뿐만아니라 안쪽에도 적어줘야한다는 것이다. 이유에 대해서는 현재 답을 찾고 있는 중으로 내일 TIL에서 추가적으로 내용을 남겨놓을 예정이다.
2) 프로그래머스 70번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131124
# 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL
# 회원 이름, 리뷰 텍스트, 리뷰 작성일 출력
# 리뷰 작성일 기준 오름차순, 리뷰 텍스트 기준 오름차순 정렬
70번 문제의 요구사항이다.
이 문제 역시도 69번 문제와 마찬가지로 우선적으로 조건을 걸어줘야하는 부분이 있기때문에
WHERE절의 서브쿼리문을 활용하여 리뷰를 가장 많이 작성한 회원을 뽑아내고,
그 회원에 대한 회원이름, 리뷰 텍스트, 리뷰 작성일을 출력한다.
완성된 코드는 아래와 같다.
SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d') REVIEW_DATE
FROM MEMBER_PROFILE A JOIN REST_REVIEW B ON A.MEMBER_ID = B.MEMBER_ID
WHERE A.MEMBER_ID =
(
SELECT A.MEMBER_ID
FROM MEMBER_PROFILE A JOIN REST_REVIEW B ON A.MEMBER_ID = B.MEMBER_ID
GROUP BY A.MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1
)
ORDER BY 3, 2
3) 프로그래머스 71번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131537
# 2022년 3월의 온/오프라인 상품 판매 데이터
# 판매 날짜, 상품ID, 유저ID, 판매량을 출력
# 오프라인 테이블의 USER_ID 값은 NULL로 표시
# 판매일 기준 오름차순, 상품ID 기준 오름차순, 유저ID 기준 오름차순
71번 문제의 요구사항이다.
이 문제의 경우 이전에 봐왔던 문제들처럼 두 개의 테이블이 주어진다.
그런데 JOIN을 쓰자니 두 테이블을 이어줄 수 있는 공통된 컬럼이 존재하지 않는다.
이 문제에서는 UNION을 사용해야한다.
JOIN의 경우 중복 컬럼을 기준으로 해서 두 테이블을 좌우로 붙여준다.
그런데 UNION의 경우 JOIN처럼 좌우로 붙이는게 아니라 상하로 붙인다.
유의할 점은 결합하려는 두 테이블의 컬럼 개수를 동일하게 지정해줘야한다는 점이다.
※ UNION에는 그냥 UNION과 UNION ALL이 있는데 두 개를 구별짓는 기준은 중복값을 허용하느냐 허용하지 않느냐이다.
UNION은 중복값을 허용하지 않고, UNION ALL은 중복값을 허용한다.
'데이터 분석 공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL(Today I Learned)15일차(23.12.18) (1) | 2023.12.18 |
---|---|
TIL(Today I Learned)14일차(23.12.15) (0) | 2023.12.15 |
TIL(Today I Learned)12일차(23.12.13) (0) | 2023.12.13 |
TIL(Today I Learned)11일차(23.12.12) (0) | 2023.12.12 |
TIL(Today I Learned)10일차(23.12.11) (1) | 2023.12.11 |