SQL 문제풀이 복습
문제 링크
집계함수와 case when을 조합하면
간단한 쿼리로 해결할 수 있는 문제.
1트에서는 분모 따로, 분자 따로 구하고 join해서 구했는데 굳이 그럴 필요 없을 듯.
SELECT order_date,
ROUND(100.0 * COUNT(CASE
WHEN order_date = customer_pref_delivery_date THEN
delivery_id
end) / COUNT(delivery_id), 2) AS
"immediate_percentage"
FROM Delivery
GROUP BY 1
ORDER BY 1;
SELECT bike_number,
MAX(end_time) AS "end_time"
FROM Bikes
GROUP BY 1
ORDER BY 2 DESC;
문제 링크
처음에는 join을 써서 해결할 수 있지 않을까 싶었는데,
아래와 같은 케이스에 걸렸다.
user_id 4번의 경우
완전히 똑같은 구매 내역이 연달아 2번 있는데,
이 경우도 어쨌든 두 번째 구매가 7일 이내에 이루어졌으므로
결과에 포함되어야 한다.
그런데 여기서 join을 쓰게 되면
4번 뿐만 아니라 다른 user_id도
서로 같은 구매내역끼리 join되는 문제가 생기는데,
예컨대 주문id 같은 고유 식별자가 없으므로
4번과 다른 user_id간의 차이를 발라낼 수 없게 되는 셈.
결국 lead를 써서
첫 번째 구매와 두 번째 구매를 한 행에서 연산할 수 있게 만든 다음
서브쿼리로 처리해서 해결했다. 아래는 완성된 정답 쿼리.
SELECT DISTINCT user_id
FROM (
SELECT user_id,
created_at,
LEAD(created_at) over(partition BY user_id ORDER BY created_at) AS "2nd"
FROM Users) result
WHERE DATEDIFF(2nd, created_at) <= 7;