본문 바로가기

SQL/StrataScratch

[MySQL] (Medium) Finding User Purchases

문제: https://platform.stratascratch.com/coding/10322-finding-user-purchases?code_type=3

 

나의 풀이:

못 풀었땅,,ㅠ

나의 잘못된 접근

with first_purchase as (
     select user_id
          , min(created_at) as first_purchase
     from amazon_transactions
     group by user_id)
     
, second_purchase as (
    select user_id
         , min(created_at) as second_purchase
    from amazon_transactions t
    where created_at > (select first_purchase
                        from first_purchase f
                        where t.user_id = f.user_id)
    group by user_id)
    
select user_id
from first_purchase
	 join second_purchase using (user_id)
where datediff(second_purchase, first_purchase) <= 7

참고로 위드절을 따로 두개를 사용하지는 못 한다.

쉼표로 구분해줘야함

 

근데 쿼리가 어디서 왜 틀렸는지 모르겠당

 

별개로 Firs랑 second_purchase를 한번에 불러오는 방법을 찾아옴

with tb as (
    select user_id
         , min(created_at) as first_purchase
         , min(case when created_at > (select min(t2.created_at)
                                       from amazon_transactions t2 
                                       where t1.user_id = t2.user_id)
                    then created_at end) as second_purchase
    from amazon_transactions t1
    group by user_id
)

select user_id
from tb
where datediff(second_purchase, first_purchase) <= 7
order by user_id;

 

케이스도 쓸 줄 알고 상관부속쿼리도 쓸 줄 알면서 

케이스를 안에서 상관부속쿼리를 쓸 생각을 왜 못했을까?

 

아무튼 first와 second_purchase를 한번에 불러왔지만, 아직도 틀린 쿼리이다.

 

문제는.. 왜 틀리는지 모름 ㅠ 챗지피티한테 물어봐도.. 이상한 쿼리만 알려주고.. 

하위쿼리에서 문제가 생기는 듯 한데, 왜 문제가 되는지에 대해서 명확하게 알려주지 않는다

참조를 제대로 못한다느니.. 그니까 왜 못하냐고? 이유를 알려달라고요ㅠ

 

성능을 떠나서 어디가 왜 틀렸는지 찾고 고치고 싶었는데..

아웅 해결을 못 해서 아쉽다

 

솔루션

SELECT DISTINCT a1.user_id
FROM amazon_transactions a1
JOIN amazon_transactions a2 ON a1.user_id = a2.user_id
AND a1.id <> a2.id
AND DATEDIFF(a2.created_at, a1.created_at) BETWEEN 0 AND 7
ORDER BY a1.user_id;

쿸 이렇게 간단하다니..

같은 유저 아이디를 기준으로 셀프 조인을 하는디

이때 구매 아이디는 달라야하고 날짜 차이가 0~7일 사이어야 한다.

동일한 구매끼리는 날짜 차이를 볼 필요가 없으니까 동일한 유저에 구매 아이디는 다르게 조건을 주는 거고,

다른 구매와 날짜 차이가 7일 이내에 있기만 하면 몇개가 있던지 7일 이내 두번째 구매가 존재하는 거니까

날짜 차이가 0~7인 애들을 다 가져오고 distinct user_id를 해준 듯

 

하,, 나는 첫번째 두번째에 집착했는데 그럴 필요가 없었다

중요한 건 두번째 구매 날짜가 아니라 7일 이내에 두번째 구매를 한 사람이었다는걸,,,

 

내 로직이 어디가 틀렸는지 못 찾아서.....하.... 시간만 날렸나!!! 답답!!! 하지만

그래도 상관부속쿼리! 처음으로 스스로 생각해내서 (틀렸지만 ㅋ) 시도해본 건 좋았땅,, 🥲

 

궁금한 거,,

1. 같은 컬럼명으로 조인할 때 Using을 즐겨 쓰는데 on이 성능이 더 좋은가? Using 쓰는게 쿼리도 더 간단하고 중복 컬럼도 안 생기고 좋지 않나..

-> 성능이 더 좋고 이런 건 없나봄. 다만 on이 컬럼명이 다를 때도 쓸 수 있고 더 명확하니까 유연성 명확성이 더 높다! 정도인듯?

 

2. 조인에서 and를 붙이는거랑 where를 쓰는거랑 차이가 있는지? 

-> 모,, dbmas에 따라 성능 차이가 있을 순 있는데 이것도 크게 유의미한 차이까지는 없는듯 

 

그냥 처음부터 조건에 맞는 애들만 조인을하거나, 조인을 한 다음에 필터링을 하거나 차이 정도?

그렇다면 나는 계속 Using,, where을 쓰겠읍니다,, 총총,,,

 

'SQL > StrataScratch' 카테고리의 다른 글

[MySQL] (Medium) Risky Projects  (1) 2024.02.08
[MySQL] (Medium) New Products  (1) 2024.02.08
[MySQL] Activity Rank  (0) 2024.02.01
[MySQL] (Medium) Users By Average Session Time  (2) 2024.01.31
[MySQL] (Medium) Workers With The Highest Salaries  (0) 2024.01.26