본문 바로가기

SQL/DataLemar

[PostgreSQL] (Medium) Histogram of Users and Purchases [Walmart SQL Interview Question]

문제: https://datalemur.com/questions/histogram-users-purchases

 

나의 풀이: 웨어 조건절에 서브쿼리 쓰기

SELECT transaction_date
    , user_id
    , COUNT(*) AS purchase_count
FROM user_transactions
WHERE (transaction_date, user_id) IN (
  SELECT MAX(transaction_date) AS transaction_date
      , user_id
  FROM user_transactions
  GROUP BY user_id)
GROUP BY user_id, transaction_date
ORDER BY 1;

 

솔루션: 랭크 윈도우 함수 사용 및 위드문 사용

WITH tb AS (
  SELECT *
       , RANK() OVER(PARTITION BY user_id ORDER BY transaction_date DESC) AS ranking
  FROM user_transactions)
  
SELECT transaction_date
     , user_id
     , COUNT(product_id) AS purchase_count
FROM tb
WHERE ranking = 1
GROUP BY transaction_date, user_id
ORDER BY 1;

호오옹

위드문 부분은 웨어절에서 서브쿼리로 넣으면 되고

윈도우 함수 부분이 인상적! 윈도우 함수보다 웨어절로 푸는 습관이 들어있는 듯

 

나는 아이디별 날짜 맥스값으로 가장 최근 날짜를 찾아서 여기에 일치하는 데이터만 따로 추출을 했다면

 

윈도우 함수는 아이디별로 날짜를 기준으로 내림차순으로 랭킹을 매겨서 1등이 가장 최근 날짜가 되게 함 << 호옹

여기서 포인트는 dense_rank() 가 아니라 rank()인 것도 있다

결국 가장 최근 날짜에 물건을 몇개 샀는지 카운트를 해야한다. 그 뜻은 곧 1등이 여러개!

그래서 무조건 덴스 랭크가 아닌 랭크를 써야한다.

 

아주 EZ하군! 하면서 풀었는데 솔루션 보고 랭크로 푸는 방법도 알게 되었다 굿굿