MySQL 리트코드 | Immediate Food Delivery Ⅱ (WHERE절 서브쿼리 활용)

    728x90

     

    문제

    https://leetcode.com/problems/immediate-food-delivery-ii/description/?envType=study-plan-v2&envId=top-sql-50

    • 고객 별 첫 번째 주문일자 기준 선호하는 배달 방식이 'immediate'인 고객의 백분율 구하기  
      • order_date 와 customer_pref_delivery_date가 같은 경우, 'immediate'
      • order_date 와 customer_pref_delivery_date가 다른 경우, 'scheduled'

     

    테이블

    Delivery delivery_id customer_id order_date customer_pref_delivery_date
    1 1 2025-08-01 2025-08-02
    2 2 2025-08-02 2025-08-02
    3 1 2025-08-11 2025-08-12
    4 3 2025-08-24 2025-08-24
    5 3 2025-08-21 2025-08-22
    6 2 2025-08-11 2025-08-13
    7 4 2025-08-09 2025-08-09
    • 각 고객 별로 첫 번째 주문일자 행의 order_date와 customer_pref_delivery_date만 비교해보면 됨.
      • (customer_id = 1) scheduled
      • (customer_id = 2) immediate
      • (customer_id = 3) scheduled
      • (customer_id = 4) immediate
    • 전체 4명의 고객 중 선호 배달 방식이 'immediate'인 고객은 2명으로 백분율은 (2 / 4) * 100 = 50.00 

     

    풀이과정

    ▶ AVG(조건문) 사용 정답

    # 고객 별 첫 번째 주문일자 행만 추출하기

    • WHERE 조건절에 IN() 함수 및 서브쿼리 활용 
      • (고객 별, 주문일자) 조합이 서브쿼리 결과테이블 정보에 포함되는 경우만 추출.
      • IN() 함수 내에 작성한 서브쿼리는 고객 별 첫 주문일자(MIN함수 활용)를 반환하고 있음. 

     

    # 'immediate' 비율 구하기

    • WHERE 조건절에 대한 결과로 '고객 별 첫 주문 일자' 관련 데이터만 테이블로 추출된 상태
    • AVG() 함수를 사용해 전체 중 order_date와 customer_pref_delivery_date가 같은 경우의 비율을 구함.
    • 백분율 형식을 위해 *100 해줌.

     

    # 정답

    • ROUND() 함수로 결과값을 소수점 둘째자리로 맞춤.
    1
    2
    3
    SELECT ROUND(AVG(order_date=customer_pref_delivery_date)*1002) immediate_percentage
    FROM Delivery
    WHERE (customer_id, order_date) IN(SELECT customer_id, MIN(order_date) FROM Delivery GROUP BY customer_id)
    cs

     

    다른 사람 풀이 참고

    ▶ AVG(DATEDIFF(날짜1, 날짜2)=0) 사용 정답

    # 고객 별 첫 번째 주문일자 행만 추출하기

    • 이 부분은 동일

     

    # 'immediate' 비율 구하기

    • WHERE 조건절에 대한 결과로 '고객 별 첫 주문 일자' 관련 데이터만 테이블로 추출된 상태
    • AVG() 함수 내에 DATEDIFF() 함수를 사용해 order_date와 customer_pref_delivery_date의 차이가 0인 경우의 비율을 구함.
    • 백분율 형식을 위해 *100 해줌.

     

    # 정답

    • ROUND() 함수로 결과값을 소수점 둘째자리로 맞춤.
    1
    2
    3
    SELECT ROUND(AVG(DATEDIFF(order_date, customer_pref_delivery_date)=0)*1002) immediate_percentage
    FROM Delivery
    WHERE (customer_id, order_date) IN(SELECT customer_id, MIN(order_date) FROM Delivery GROUP BY customer_id)
    cs

     

     

     

    728x90

    댓글