문제들이 점점 복잡해지는 것 같다..!

Leetcode) Immediate Food Delivery II

문제 설명 번역

  • 고객이 선호하는 배송 날짜가 주문 날짜와 같으면 주문을 즉시라고 합니다. 그렇지 않으면 예약됨이라고 합니다.

  • 고객의 첫 번째 주문은 고객의 주문 날짜가 가장 빠른 주문입니다. 고객이 정확히 하나의 첫 번째 주문을 가지고 있음을 보장합니다.

  • 모든 고객의 첫 번째 주문에서 즉시 주문의 비율을 소수점 이하 2자리로 반올림하여 구하는 솔루션을 작성합니다.

첫 주문 날짜와 배송 날짜가 같으면 즉시 배송이 되는 것임. 첫 주문에 즉시배송이 당첨되기 어려운건지 첫주문에 즉시배송이 걸린 소비자의 비율을 구하는 문제였다.
핵심 키워드는 첫 주문일자 찾기, 첫주문만 가지고 비율 구하기!

#주문 날짜와 배송날짜가 같을 때 백분율로 바꾸고 소숫점 두번째 자리까지 반올림!
select  ROUND(avg(order_date = customer_pref_delivery_date)*100, 2) as immediate_percentage
#테이블 호출
from delivery
#소비자 id와 주문 일자를 서브쿼리로 최소 주문일자를 지정하면서 첫 주문일자 조건으로 줌
where (customer_id, order_date) in (
    select customer_id, min(order_date) 
    from delivery
    group by 1) #소비자가 중복되면 안되니 그룹화

Leetcode) Game Play Analysis IV

문제 설명 번역

  • 처음 로그인한 날의 다음 날에 다시 로그인한 플레이어의 비율을 소수점 이하 2자리로 반올림하여 보고하는 솔루션을 작성합니다. 즉, 첫 번째 로그인 날짜부터 최소 2일 연속으로 로그인한 플레이어 수를 계산한 다음 해당 숫자를 총 플레이어 수로 나눠야 합니다.

최초로 로그인한 날부터 최소 이틀 연속 게임을 한 사람의 비율이 어떤지 찾는 문제였다. 문제는 심플했지만 date_sub()함수를 몰라서 솔루션을 찾아봐서 풀게되었다ㅠㅠ
헥심 키워드는 최초로그인한 날짜의 다음 날짜가 존재하는지 확인하는 것이다.

# 메인쿼리의 이틀연속 로그인한 사용자에서 전체 사용자를 나눠줌 + 소숫점 두번째자리 올림
select ROUND(count(DISTINCT player_id)/(select count(distinct player_id) from activity), 2) as fraction
# 테이블 호출
from activity
# date_sub(특정 컬럼, 원하는 타입의 시간 빼기 가능)
# 서브쿼리의 최소 이벤트 발생 일자가 date_sub()함수에 대응 가능한 일자가 있는지 찾아준다.
where (player_id, date_sub(event_date, interval 1 day)) in (
    select player_id, min(event_date) from activity group by player_id
)

* 기억하기

  • 조건을 모두 Where 절로 풀려 하지말기
  • Select 절에서 집계함수, if, case when 활용하기
  • SQL 실행 순서대로 생각하며 런타임이 짧게 쿼리 짜기
profile
Data analyst를 향해 도전하는 이야기

0개의 댓글

Powered by GraphCDN, the GraphQL CDN