나의 풀이:
구했는데 답이 틀렸다고 나오길래 고민좀 하다가 이유를 모르겠어서
힌트를 봤더니 처음부터 문제를 잘못 이해한거였다!
1 session per day! 여서 유저당 date 별로 세션이 생기는건데
per day 부분을 처음에 놓치고 나는 그냥 최근 세션 값 하나만 구한거였음
어쩐지 average를 구하라더라!! 나는 최근 값 하나만 고려하라면서 웬 평균?! 뭔가 이상하다고 생각만 했음 ㅋㅋ
암튼 문제를 다시 이해하고 풀었는데..
with tb as (
select user_id
, date(timestamp) as 'date'
, max(if(action='page_load', timestamp, null)) as 'ltime'
, min(if(action='page_exit', timestamp, null)) as 'etime'
from facebook_web_log
group by user_id, DATE(timestamp)
order by user_id)
select user_id
, avg(timediff(etime,ltime)) as session_time
from tb
group by user_id
having session_time is not null;
이때 timediff를 써야 timestamp 빼기 연산이 가능하다! 그냥 a - b 하면 0 뜸 ㅠ
근데 또 틀림!!! 아놔
이유를 또 모르겠어서 ㅠ 솔루션을 봤다
with tb as (
select user_id
, date(timestamp) as 'date'
, max(if(action='page_load', timestamp, null)) as 'ltime'
, min(if(action='page_exit', timestamp, null)) as 'etime'
from facebook_web_log
group by user_id, DATE(timestamp)
order by user_id)
select user_id
, avg(TIMESTAMPDIFF(SECOND, ltime, etime)) as session_time
from tb
group by user_id
having session_time is not null;
문제는 바로 timediff가 아니라 timestampdiff 함수를 썼어야 했다
함수 사용법:
timediff(시간1, 시간2) -> 시간1 - 시간2
timedatediff(형태, 시간1, 시간2) -> 시간2 - 시간1 in 형태
빼기 순서좀,, 통일해주면 안 될까요?ㅠ
함수 차이:
timediff는 결과를 시간 전체, 'HH:MM:SS' 형태를 반환한다
반면에 timedatediff는 원하는 시간 단위를 정해줄 수 있다
second, hour, day, week 등등,,
그리고 이번 문제에서는 결괏값의 형태를 second로 지정해주면 된다
timediff에 avg 한 결과는 'HH:MM:SS' 형태가 아니라 그냥 숫자던데 단위가 뭐였라나?
챗지피티한테 물어봤더니 avg 씌워도 똑같이 'HH:MM:SS' 형태로 나온다는데
내가 얻는 값은 5123.5 이다
엥
그래서 avg 빼고 timediff 값만 확인해 봤는데 결과는 이렇다
일단 'HH:MM:SS' 형태는 아니고,, 살펴보면 second 단위인 듯 한데
그러면 형태를 second로 지정해준 timestampdiff랑 똑같은 거 아닌가?
진짜로 똑같음;
다시 avg 씌워보기,,
- timediff
- timestampdiff
avg에서 연산이 다르게 되는가보다
일단 82+3685 의 평균은 1883.5가 맞다! 그래서 avg(timestampdiff)가 내가 원하는 연산을 해준 것인데
avg(timediff)는 어떻게 연산했길래 오천얼마가 나왔는지는 잘 모르겠다,,
슬슬 귀찮지만 마지막으로 챗지피티한테 물어봤다
흠,,
timediff는 문자열!!을 반환하고
timestampdiff는 정수!!를 반환한다고..
그래서 문자열에 avg를 적용해서 다른 값이 나왔고
timestampdiff는 정수여서 내가 원했던 연산을 그대로 해준듯!!!
그러면 문자열에 avg를 적용했을 때 반환하는 값은 뭘까..?
찐막..
챗지피티 말로는 문자열 길이!!!의 평균 반환해준다는데
82, 3685의 길이 평균이 어떻게 오천얼마가 나오나요 ㅠ? 흑흑,,
그룹바이 date(timestamp) 하고 avg를 하는 과정에서 뭐가 또 다르나,,?
모르겠따,,,,,,
오천얼마는 해결 못했지만 그래도 중요한 내용은 다 안 것 같으니 이만 끝,,!
'SQL > StrataScratch' 카테고리의 다른 글
[MySQL] (Medium) New Products (1) | 2024.02.08 |
---|---|
[MySQL] (Medium) Finding User Purchases (2) | 2024.02.07 |
[MySQL] Activity Rank (0) | 2024.02.01 |
[MySQL] (Medium) Workers With The Highest Salaries (0) | 2024.01.26 |
[MySQL] (Medium) Most Profitable Companies (0) | 2024.01.26 |