반응형
mysql을 사용합니다
# 1141 User Activity for the Past 30 Days I
easy 난이도이지만 날짜 조건을 연습해볼 수 있는 문제이기 때문에 가져왔습니다.
Q. 2019년 7월 27일까지 약 한달 간의 일일 active user 수를 구하여라
풀이
- key : sub query, datediff
- 서브쿼리
- active date가 2019년 7월 27일보다 이전이고, 날짜의 차이가 1달인 데이터를 저장합니다
- 날짜를 기준으로 group by 함으로써 일일 active user를 구합니다
- 시간 : 790 ms
- 메모리 : 0b
select a.activity_date as day, count(distinct a.user_id) as active_users
from (select * from Activity where activity_date < '2019-07-27' and datediff('2019-07-27', activity_date) < 30) as a
group by day
# 1070 Product Sales Analysis III
쿼리 자체는 어렵지 않지만, 문제가 명확하지 않은 느낌이라 풀이해보았습니다.
Q. 상품이 팔린 첫 해의 상품 id, 연도, 수량, 가격을 구하여라
풀이
- key : sub query, rank
- 서브쿼리 : 각 상품에 대해 상품이 판매된 첫 해를 구합니다
- rank() 에서 상품별로 partition by를 하여 상품별로 순서를 계산합니다. 첫 해를 구하기 위해 순서는 year로 지정합니다.
- where 조건절에서 rank가 1인 경우만 필터링되도록 설정합니다.
- 시간 : 1644ms
- 메모리 : 0b
select s.product_id, s.year as first_year, s.quantity, s.price
from (select product_id, year, quantity, price, rank() over (partition by product_id order by year) as rnk from Sales) s
where s.rnk = 1
# 1045 Customers Who Bought All Products
medium 난이도이지만 그렇게 어려운 문제는 아닙니다. 연습용으로 푸시면 좋을 것 같아요
Q. product 테이블에 있는 모든 상품을 구매한 고객 id를 구하여라
풀이
- key : subquery, group by
- 고객 id를 하나씩만 나타내기 위해 group by를 사용합니다.
- having 조건절에서 서브쿼리를 이용하여 모든 상품을 구매한 고객 id만 나타냅니다
- 고객별 product_key의 고유값 개수가 product 테이블의 개수와 동일한지 따집니다
- 고객이 하나의 상품을 여러 번 결제하는 경우도 있기 때문에 distinct를 걸어줍니다.
- 시간 : 835ms
- 메모리 : 0b
select customer_id
from Customer
group by customer_id
having count(distinct product_key) = (select count(product_key) from Product)
'Data > SQL' 카테고리의 다른 글
[리트코드] SQL 50 - Subqueries 문제 풀이(# 626, # 1321, # 585) (1) | 2023.10.20 |
---|---|
[리트코드] SQL 50 - Advanced Select and Joins 문제 풀이(# 1789, # 180, # 1164) (0) | 2023.10.16 |
[리트코드] SQL 50 - Basic Aggregate Functions 문제 풀이(# 1251, # 1174, # 550) (0) | 2023.10.09 |
[리트코드] SQL 50 - Basic Join 문제 풀이(# 1280, # 570, # 1934) (0) | 2023.10.01 |
해커랭크 SQL 문제 풀이 - Medium ③ (0) | 2023.05.22 |