SQL 문제풀이 복습
문제 링크
어제 복습해봤던 문제의 약간 다른 버전.
본 쿼리의 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;