241125_TIL

J Lee·2024년 11월 25일
0

아무리 사소하더라도 배움이 없는 날은 없다.

SQL 문제풀이 복습


Leetcode

문제 링크
집계함수와 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;
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보