[ORACLE_SQL](LEET_CODE)1174. Immediate Food Delivery II(X)

이경영·2023년 7월 27일
0

오라클

목록 보기
33/43

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

문제)

문제 뜻

ORDER_DATE와 CUSTOMER_PREF_DELIVERY_DATE가 같으면 즉시주문이고, CUSTOMER_ID 각각이 첫번째로 주문한 오더들 중에서 즉시주문의 비율을 구하는 문제.

어떻게 접근해야할까

  1. 즉시주문의 정의
  2. 첫번째로 주문한 오더

내가 생각한 방안

첫번째로 즉시주문이란. case when 구문으로 ORDER_DATE와 CUSTOMER_PREF_DELIVERY_DATE가 같은경우 1, 아닌경우 0을 둬서 풀면 된다고 생각했다.
그러나, 두번째인 첫번째로 주문한 오더에서 막히고 말았다.... 아무 생각도 안나서 찾아보니 rank()함수를 쓰면 되는거였음 (아 맞다...) 나 예전에도 이런 sql을 현업에서 본적이 있었다! 근데 왜 지금은 까먹은것인가 정말 알수없는 기억력이다... 그때 열심히 정리까지 해놓고 ㅜㅜ

결국 case문만 써놓고 틀리고말았...
보니까 with 절까지 사용해서 임시 테이블을 만들고 select를 하는게 더 편해보였다

rank() over (partition by customer_id order by order_date)

그룹을 나눠 랭킹을 정하는 함수다!
customer_id로 내부 그룹바이를 한 다음에
(그러니까 1 1 2 2 3 3 4 4 이런식으로 customer_id가 그룹화된다.)
order_date로 그룹화된 범위 내에서 과거부터 order_date 정렬한다.
제일 내부 select문을 돌리면 output이 이렇게나옴

ranking=1을 따로 select * from ~ 문으로 묶어준 이유는 내부의 as ranking으로 설정해놓은 부분을 인식을 못하기 때문이다!


/* Write your PL/SQL query statement below */
with cte as(
  select *
  from(
    select delivery_id,
            customer_id,
            order_date,
            rank() over(partition by customer_id order by order_date) as ranking,
            customer_pref_delivery_date,
            (case when order_date=customer_pref_delivery_date then 1 else 0 end) as ordertime
    from Delivery 
  ) where ranking=1
)

select round(sum(ordertime)/count(*)*100,2) as immediate_percentage from cte
profile
꾸준히

0개의 댓글