문제: 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 |