새로 알게된 코드
date_sub 함수
-날짜/시간 빼주는 함수
-형식 : date_sub(기준날짜, interval ~day(hour))
SQL 카타
날짜(date_sub) 활용
문제 98. Game Play Analysis IV - LeetCode
Write a solution to report the fraction of players that logged in again on the day after the day they first logged in, rounded to 2 decimal places. In other words, you need to count the number of players that logged in for at least two consecutive days starting from their first login date, then divide that number by the total number of players.
The result format is in the following example.
오답
select if(min(event_id)-max(event_id) = 1, 1, 0)
from acitivity
where event_date in (select event_date
from activtiy
group by player_id
order by 1 asc
limit 2)
group by player_id
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
what the...
정답
select round(count(distinct player_id)/(select count(distinct player_id) from activity), 2) as fraction
from activity --(2)의 날짜가 있는 id를 구해주고 전체 id로 나눠줌
where (player_id, date_sub(event_date, interval 1 day)) --최초 접속일로부터 하루 지난뒤(2)
in (
select player_id,
min(event_date) as first_login --가장 빠른 날짜(최초접속일)(1)
from Activity
group by player_id)
사실 지금까지 공부했던 함수를 통해서 풀려면 아예 못 풀 문제는 아닌 것 같긴 하지만, 유형 자체를 처음 접하는 거라 결국 solution들을 볼 수밖에 없었던 문제.
최초 날짜와 두번째 날짜를 비교하는 문제라 윈도우 함수 같은 것을 써야하나 싶었지만, 최초 날짜 다음 날이 있는지 확인해주는 것만으로도 해결 가능한 문제였다.
날짜 활용 심화 문제인 것 같아서 기억해두면 좋을 듯!
where in 심화
문제101. 1070. Product Sales Analysis III
Write a solution to select the product id, year, quantity, and price for the first year of every product sold.
Return the resulting table in any order.
The result format is in the following example.
오답
select s.product_id,
s.year as first_year,
s.quantity,
s.price
from sales s join product p using(product_id)
where s.year in (select min(year)
from sales
group by product_id)
group by product_id
처음 썼던 오답. where in과 min()을 통해 최초 년도를 잡아줬고 처음 제시된 case에서는 답이 맞다고 떴는데
그 외의 예제에서 오답이 떠서 틀렸다.
이래저래 생각해보니 where 절에 year만 잡아줘서 최초년도가 잡히고, 그게 또 본 쿼리의 group by와 이상하게 섞여서 날짜와 product_id가 이상하게 매칭이 됐던 모양.
정답
select product_id,
year as first_year,
quantity,
price
from sales
where (product_id, year) in
(select product_id ,min(year)
from sales
group by product_id)
정답이라 생각하고 초반에 본 쿼리에다가 group by product_id를 넣어줬었는데 오답이라고 떴다.
굳이 안 넣어줘도 되긴 하지만 그런다고 틀린 건 아니지 않은가?(육안상 expected result와 output이 다르진 않았다)
아무튼 where절로 최솟값/최댓값 등과 더불어 그와 상응하는 case의 데이터를 추출할 때엔 해당 데이터의 칼럼도 언급해주어야만 한다.
문제97. 1174. Immediate Food Delivery II
select round(count(distinct customer_id)/(select count(distinct customer_id) from delivery)*100,2) as immediate_percentage
from delivery
where (customer_id, order_date) in
(select customer_id,
min(order_date) as first_order
from delivery
group by customer_id) and order_date=customer_pref_delivery_date
처음 풀 땐 헷갈렸지만 위의 문제를 제대로 풀고 나니 막혔던 부분이 바로 해소되었던 문제.
TMI
-지난주는 프로젝트와 이삿짐 마무리 정리 때문에 일주일 내내 어떻게 살아있었나 싶을 정도로 정신없었던 한주였다. 그러다보니 TIL도, WIL도 본캠 시작하고 처음으로 스킵...했던듯...ㅎ어찌됐든 팀 프로젝트가 만족스럽게 잘 마무리 됐고, 팀원들 간 사이도 너무 좋았어서 여러모로 즐거운 한 주였다.
-프로젝트 시작 즈음부터 카타를 조금은 소홀히 했더니 어느새 뒤쳐지는 거 같은 느낌. 아무리 피곤하고 정신없어도 정신바짝차리고 매일 꾸준히 해야겠다. 그리고 주말 약속은 당분간 맥시멈 하나만 잡는걸로.ㅠ