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)
와 같은 형태도 가능하다는 것이다.
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번이나 활용했다.
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를 사용하지 않아도 하나의 테이블을 여러번 사용할 수 있다는 것을 알게 되었다.
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의 합을 구하여 조건을 만족하는 이벤트의 총 수를 계산합니다.
너무 쉬웠다~ 패스 ~