본문 바로가기

SQL/StrataScratch

[MySQL] (Medium) Users By Average Session Time

문제: https://platform.stratascratch.com/coding/10352-users-by-avg-session-time/official-solution?code_type=3

 

나의 풀이:

구했는데 답이 틀렸다고 나오길래 고민좀 하다가 이유를 모르겠어서

힌트를 봤더니 처음부터 문제를 잘못 이해한거였다!

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를 하는 과정에서 뭐가 또 다르나,,?

모르겠따,,,,,, 

 

오천얼마는 해결 못했지만 그래도 중요한 내용은 다 안 것 같으니 이만 끝,,!