241127_TIL

J Lee·2024년 11월 27일
0

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

SQL 문제풀이 복습


Leetcode

문제 링크
어제 복습해봤던 문제의 약간 다른 버전.
본 쿼리의 where절에 서브쿼리를 넣어야 하는 문제 때문에
이건 킹쩔수없이 cte를 써서 해결했다.

안 그러면 서브쿼리의 서브쿼리의... 이런 식으로
너무 길게 이어질 것 같았음ㅜ
아니면 다른 방법이 있는데 내가 못 찾았던 것일지도?

WITH result
AS
  (
            SELECT    *
            FROM      (
                               SELECT   customer_id,
                                        COUNT(transaction_id) AS "total"
                               FROM     Transactions
                               GROUP BY 1) a
            LEFT JOIN
                      (
                               SELECT   customer_id AS "customer_id2",
                                        COUNT(*)    AS "consecutive"
                               FROM     (
                                                 SELECT   customer_id,
                                                          transaction_id,
                                                          date_sub(transaction_date, INTERVAL rank() over(partition BY customer_id ORDER BY transaction_date) DAY) AS "group_id"
                                                 FROM     Transactions) b
                               GROUP BY customer_id,
                                        group_id) c
            ON        a.customer_id = c.customer_id2)
  SELECT customer_id
  FROM   result
  WHERE  consecutive =
         (
                SELECT MAX(consecutive)
                FROM   result);

문제 링크
join과 서브쿼리, case when을 섞으면
어렵지 않게 풀 수 있는 문제다.
null이 뜰 경우를 대비해 ifnull을 써 주는 것만 주의.

SELECT f.flight_id,
       IFNULL(CASE
                WHEN capacity <= total_passenger THEN capacity
                ELSE total_passenger
              end, 0) AS "booked_cnt",
       CASE
         WHEN capacity < total_passenger THEN total_passenger - capacity
         ELSE 0
       end            AS "waitlist_cnt"
FROM   Flights f
       LEFT JOIN (SELECT flight_id,
                         COUNT(*) AS "total_passenger"
                  FROM   Passengers
                  GROUP  BY 1) a
              ON f.flight_id = a.flight_id
ORDER  BY 1;

문제 링크
rank를 써서 flight_id당 예약 순서(booking_list)를 구한 다음,
capacity와 booking_list를 case when으로 비교해서
Confirmed와 Waitlist를 분기 처리해 주면 된다.
hard 난이도 중에서는 그래도 간단한 편에 속하는 문제.

SELECT passenger_id,
       CASE
         WHEN capacity >= booking_list THEN 'Confirmed'
         ELSE 'Waitlist'
       END AS "Status"
FROM   Flights f
       LEFT JOIN (SELECT passenger_id,
                         flight_id,
                         booking_time,
                         RANK()
                           OVER(
                             partition BY flight_id
                             ORDER BY booking_time) AS "booking_list"
                  FROM   Passengers) a
              ON f.flight_id = a.flight_id
WHERE  passenger_id IS NOT NULL
ORDER  BY 1; 
profile
기본기를 소홀히 하지 말자

0개의 댓글

관련 채용 정보