huginn muninn

[Leetcode] SQL Medium 1174, 550, 1070, 1045 본문

코딩테스트

[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)에서 고객 아이디 기준으로 그룹바이한 후 구매한 제품수를 셌을 때 전체 제품 수와 같으면 된다.