Data/SQL

[리트코드] SQL 50 - Sorting and Grouping 문제 풀이(# 1141, # 1070, # 1045)

sennysideup 2023. 10. 12. 16:15
반응형

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)