240806

Gi Woon Lee·2024년 8월 6일
0

TIL

목록 보기
33/78

97번. Immediate Food

select 
    round(sum(case when order_date = customer_pref_delivery_date then 1 else 0 end)/count(order_date)*100, 2) as immediate_percentage 
from delivery
-- where 조건절에서 인자 위치만 맞으면 복수의 인자 일치 조건을 만들 수 있다. 
where (order_date, customer_id ) in
    (select min(order_Date), customer_id 
     from delivery
     group by customer_id)

어제 배웠던 group by 후 select 절에서 case when을 활용한 인자 필터링을 사용했다.

문제의 핵심은 where절이다.
where A in B 를 사용할 때 인자의 위치만 동일하면 복수의 인자 조건 설정도 가능하다.
where (a,b) in (A,B) 와 같은 형태도 가능하다는 것이다.

98번. Game Play Analysis

  • 나의 정답
select 
    round(count(b.player_id)/ (select count(distinct player_id) from activity),2) as fraction
from activity b
where (b.player_id, date_sub(b.event_date, interval 1 day)) in
(
    select a.player_id, min(a.event_date)
    from activity a
    group by a.player_id  
)

연속 이틀 게임을 한 사람의 비율을 구하는 문제.. 97번과 마찬가지로 where절 복수 인자 필터링이 들어갔다.

특히 칼럼 중 하나에 날짜 계산 함수 date_sub()를 사용하여 난이도가 조금 있었다.

마지막에 select절에 스칼라 서브쿼리까지 넣어주면서 하나의 테이블을 3번이나 활용했다.


  • 다른 사람의 정답(1) - 중첩 서브쿼리의 alias는 선택사항

SELECT
  ROUND(COUNT(DISTINCT player_id) / (SELECT COUNT(DISTINCT player_id) FROM Activity), 2) AS fraction
FROM
  Activity
WHERE
  (player_id, DATE_SUB(event_date, INTERVAL 1 DAY))
  IN (
    SELECT player_id, MIN(event_date) FROM Activity GROUP BY player_id
  )

이 사람이 푼 방식을 보고 굳이 alias를 사용하지 않아도 하나의 테이블을 여러번 사용할 수 있다는 것을 알게 되었다.

셀프조인 시 alias는 필수, 중첩 서브쿼리의 alias는 선택


  • 다른 사람의 정답(2) - CTE를 사용한 풀이
  with first_login as (
    select player_id, min(event_date) as first_login_date
    from Activity 
    group by player_id
)

select round(sum(datediff(a.event_date, fl.first_login_date)=1) / count(distinct a.player_id), 2) as fraction
from Activity a
join first_login fl
on a.player_id = fl.player_id;

포인트=
datediff(a.event_date, fl.first_login_date) = 1
event_date와 first_login_date의 차이가 1일인 경우에 대해 1을 반환(True니까), 그렇지 않으면 0(False니까)을 반환합니다.
SUM 함수는 이러한 1과 0의 합을 구하여 조건을 만족하는 이벤트의 총 수를 계산합니다.

99번. Number of Unique

너무 쉬웠다~ 패스 ~

0개의 댓글