문제: 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하군! 하면서 풀었는데 솔루션 보고 랭크로 푸는 방법도 알게 되었다 굿굿