코딩테스트
[Leetcode] SQL Medium 1174, 550, 1070, 1045
_maddy
2024. 6. 29. 02:41
1174. Immediate Food Delivery II
https://leetcode.com/problems/immediate-food-delivery-ii/description/
# Write your MySQL query statement below
-- 고객이 원하는 배송 날짜가 주문 날짜와 동일하면 즉시 주문이 호출된다.
-- 전체 고객의 첫번째 주문에서 즉시 주문의 비율을 소수점 이하 2자리까지 반올림해 구하는 솔루션을 작성.
-- 첫번째 주문만
WITH FIRST AS
(SELECT
CUSTOMER_ID,
MIN(ORDER_DATE) AS OD,
MIN(CUSTOMER_PREF_DELIVERY_DATE) AS DELIVERY
FROM DELIVERY
GROUP BY CUSTOMER_ID)
SELECT
ROUND(SUM(CASE WHEN OD=DELIVERY THEN 1 ELSE 0 END)/COUNT(*)*100.00,2) AS immediate_percentage
FROM FIRST
고객 아이디 기준으로 첫번째 주문만 찾은 후 비율 계산.
550. Game Play Analysis IV
https://leetcode.com/problems/game-play-analysis-iv/description/
# Write your MySQL query statement below
-- 처음 로그인 한 다음날 다시 로그인한 플레이어의 비율을 소수점 2자리로
-- 첫번째 로그인 날짜부터 최소. 2일 연속으로 로그인한 플레이어 수를 계산한다음 전체 플레이 수로 나누어야 함
WITH NEXT AS(
SELECT
PLAYER_ID,
DATEDIFF(EVENT_DATE,MIN(EVENT_DATE) OVER(PARTITION BY PLAYER_ID))=1 AS CONNECT
FROM ACTIVITY
)
SELECT
ROUND(SUM(CONNECT)/COUNT(DISTINCT PLAYER_ID),2) AS FRACTION
FROM NEXT
처음 로그인 한 날 다음날 다시 로그인한 플레이어의 비율을 구하는 것.
플레이어 아이디 기준으로 최소 날짜와 차이가 1일 차이나는 날을 구해놓고, 비율을 구하면 된다.
여기서 윈도우 함수를 적극적으로 활용해서 쉽게 구할 수 있다.
1070. Product Sales Analysis III
# Write your MySQL query statement below
-- 판매된 모든 제품의 첫 해에 대한 제품 id, 연도, 수량 및 가격을 선택하는 솔루션
SELECT
S.PRODUCT_ID AS product_id,
S.YEAR AS first_year,
S.QUANTITY as quantity,
S.PRICE as price
FROM SALES AS S
INNER JOIN
(SELECT
PRODUCT_ID,
MIN(YEAR) AS YEAR
FROM SALES
GROUP BY PRODUCT_ID) AS M
ON M.PRODUCT_ID=S.PRODUCT_ID
AND M.YEAR=S.YEAR
가장 처음 판매된 제품들의 정보를 출력하는 솔루션,
제품 아이디 기준으로 최소 년도로 group by 후 sales 데이터와 조인했다. 조인할때는 제품아이디와 년도로 inner join 하여 관련된 데이터만 가져올 수 있게끔 했다.
1045. Customers Who Bought All Products
https://leetcode.com/problems/customers-who-bought-all-products/description/
# Write your MySQL query statement below
-- 모든 제품을 구매한 고객의 아이디를 출력
SELECT
CUSTOMER_ID AS customer_id
FROM CUSTOMER
GROUP BY CUSTOMER_ID
HAVING COUNT(DISTINCT PRODUCT_KEY)
= (SELECT COUNT(*) FROM PRODUCT)
비교적 쉬웠던 문제, 제품 테이블(product)에서 전체 행의 개수를 센 다음 고객 테이블(customer)에서 고객 아이디 기준으로 그룹바이한 후 구매한 제품수를 셌을 때 전체 제품 수와 같으면 된다.