Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 백준
- DTO
- 알고리즘
- API
- 컴파일 타임 상수
- 기본키 전략
- 오블완
- compgen
- 프로그래머스
- JPA
- @SubscribeMapping
- application layer
- 리눅스
- allocationSize
- 쿠키
- 커밋 되돌리기
- intelij spring config
- 메모리 구조
- mysql
- m:n
- @Autowired
- spring
- JDBC
- 티스토리챌린지
- 편향된 지수
- 파이썬
- 런타임 상수
- Git
- 쉘 스크립트
- BindingResult
Archives
- Today
- Total
둘셋 개발!
[SQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기 본문
문제
https://school.programmers.co.kr/learn/courses/30/lessons/131534
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 해결 과정
먼저 2021년에 가입한 유저와 갯수 를 구하는 것이 먼저이다.
그래서 다음과 같은 쿼리를 사용했다.
select USER_ID, count(USER_ID)
from USER_INFO
where JOINED like '2021%'
쿼리를 실행 했더니 2021년 가입한 유저의 갯수는 잘 나오는데, 행이 총 1개만 출력되는 것이였다.
그래서 찾아봤더니 집계함수를 사용할 때 group by를 사용하지 않고 집계함수와 다른 컬럼을 함께 실행시키면
USER_ID는 랜덤으로 나온다는 것이였다.
내가 원한 결과는
USER_ID | count(USER_ID) |
1 | 4 |
14 | 4 |
20 | 4 |
30 | 4 |
이렇식으로 2021년 가입한 user_id가 모두 나오고 총 개수도 함께 나오는 것이다.
이렇게 결과가 나오려면 어떻게 해야할까?
바로 윈도우 함수를 사용하면 된다.
(https://lightson2323.tistory.com/123 글에 윈도우 함수에 대한 설명이 나옵니다!)
총 행의 개수를 구할 수 있도록 다음과 같이 작성하면 된다.
select USER_ID, COUNT(USER_ID) OVER() as total_count
from USER_INFO
where JOINED like '2021%')
그리고 문제에서 연도, 월별에 대한 통계를 구해야 하기 때문에
이때 group by에 연도, 월을 넣고 집계함수를 사용해서 값을 추출하면 된다.
정답쿼리
select
year(s.SALES_DATE) as YEAR,
month(s.SALES_DATE) as MONTH,
count(distinct u.USER_ID) as PURCHASED_USERS,
round((count(distinct u.USER_ID) / total_count), 1) as PUCHASED_RATIO
from ONLINE_SALE s
left join (
select USER_ID, COUNT(USER_ID) OVER() AS total_count
from USER_INFO
where JOINED like '2021%') u
on s.USER_ID = u.USER_ID
group by year(s.SALES_DATE), month(s.SALES_DATE)
order by YEAR asc, MONTH asc
처음에 윈도우 함수가 떠오르지 않아 2021년에 가입한 사용자의 수를 따로 계산하여 변수에 저장해서 쿼리를 작성했다.
정답이였지만, 불필요한 쿼리를 한 번더 작성하게 되므로 효율적이진 않았다.ㅎㅎㅎ
ref.
'데이터베이스' 카테고리의 다른 글
[SQL] 프로그래머스 - 특정 세대의 대장균 찾기 (0) | 2025.03.15 |
---|---|
[SQL] 프로그래머스 - 대장균의 크기에 따라 분류하기 2 (feat. 순위 관련 윈도우 함수) (0) | 2025.03.15 |
[MySQL] mysql 스레딩 (0) | 2024.11.12 |
[MySQL] 사용자 식별(1) - 계정 (0) | 2024.11.10 |
[MySQL] 시스템 변수 변경 (1) | 2024.11.09 |