일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- 데이터시각화
- OKR
- 시각화
- 언어지능딥러닝
- productmarketfit
- 컴퓨터비전
- Computer Vision
- 데이콘
- tableau
- 데이터모델링
- 자연어처리
- fit
- 태블로
- 데이터분석
- 모델링
- pmf
- dl
- 그로스해킹
- 인공지능
- Market
- nlp
- 파인튜닝
- ERD
- 머신러닝
- omtm
- DACON
- 딥러닝
- product
- Today
- Total
블로그
[Programmers] 131534 - 상품을 구매한 회원 비율 구하기 SQL MySQL 본문
https://school.programmers.co.kr/learn/courses/30/lessons/131534
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
# 첫 시도
# 21년에 가입한 회원 추출
# 상품 구매한 회원 수와 상품 구매 회원 비율을 년, 월 별로 출력
# 상품 구매 회원 비율은 소수점 두 번째 자리에서 반올림
# 전체 결과는 년 기준 오름차순, 월 기준 오름차순
SELECT YEAR(SALES_DATE) AS YEAR, MONTH(SALES_DATE) AS MONTH, COUNT(U.USER_ID) AS PURCHASED_USERS, ROUND(PURCHASED_USERS/JOINED_2021, 2) AS PURCHASED_RATIO
FROM (SELECT *, COUNT(*) AS JOINED_2021
FROM USER_INFO
WHERE JOINED LIKE '2021%') U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
GROUP BY SALES_DATE;
하면서 뭔가 잘못된 걸 느꼈는데 뭔지 모르겠어서 블로그 참고함
- 구매 이력 여러 개 있는 회원은 id 중복되는 점 -> distinct 사용해서 중복 id 제거해야 함
- 총 회원 수를 어느 부분에서 구해야 하는지 몰랐음
# 블로그 참고 코드
SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(O.SALES_DATE, '%m') AS MONTH,
COUNT(DISTINCT U.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT U.USER_ID)/(SELECT COUNT(*) FROM USER_INFO WHERE joined LIKE '2021%'), 1) AS PUCHASED_RATIO
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH ;
SELECT 절에서 2021년에 가입한 전체 회원 수를 가져오는 서브쿼리를 쓰는 방법이 있다는 것을 배웠음 ..
# 지피티 코드
SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(O.SALES_DATE, '%m') AS MONTH,
COUNT(DISTINCT U.USER_ID) AS PURCHASED_USERS,
ROUND(COUNT(DISTINCT U.USER_ID) / total_users.total_user_count, 1) AS PURCHASED_RATIO
FROM USER_INFO U
JOIN ONLINE_SALE O ON U.USER_ID = O.USER_ID
CROSS JOIN (
SELECT COUNT(*) AS total_user_count
FROM USER_INFO
WHERE JOINED LIKE '2021%'
) total_users
WHERE U.JOINED LIKE '2021%'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
지피티한테 성능 개선 시켜달라고 하고 코드 받음 ^.^
서브 쿼리가 성능 저하의 원인이 될 수 있어서 JOIN과 추가 계산 필드로 대체하라고 함
서브쿼리 부분을 CROSS JOIN으로 바꿔버림
수행 시간 비교해보니까 거의 비슷한데 블로그 참고 코드는 대체로 0.00016 정도고 지피티는 대체로 0.00017 이넴
코테 풀 때는 서브쿼리 사용해도 괜찮을 것 같다
>> 쿼리 수행시간 보는 방법
SELECT @@profiling;
SET profiling=1; # select 했을 때 0이면 1로 설정해서 profiling 활성화 시켜주기
# 실행할 코드
SHOW profiles;
>> 참고 블로그
https://jaehwaseo.tistory.com/8
프로그래머스 상품을 구매한 회원 비율 구하기 SQL(MySQL)
문제 다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER,
jaehwaseo.tistory.com
'공부' 카테고리의 다른 글
[DB] 데이터 모델링 실습 ERD 그리기 (1) | 2024.11.02 |
---|---|
[Programmers] 276035 - FrontEnd 개발자 찾기 SQL MySQL (4) | 2024.11.01 |
[Programmers] 133027 - 주문량이 많은 아이스크림들 조회하기 SQL MySQL (3) | 2024.10.31 |
[그로스해킹] AARRR - Referral (2) | 2024.10.30 |
[그로스해킹] AARRR - Revenue (3) | 2024.10.30 |