inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

BigQuery(SQL) 활용편(퍼널 분석, 리텐션 분석)

[빠짝스터디 2주차 과제] 윈도우 함수 연습문제

92

케이든

작성한 질문수 2

0

1.

--1) 사용자별 쿼리를 실행한 총 횟수를 구하는 쿼리를 작성해주세요. 단 Group By를 사용해서 집계하는 것이 아닌 query_logs의 데이터의 우측에 새로운 컬럼을 만들어주세요.

select *
     , count(query_date) over(partition by user) as total_query_cnt
  from advanced.query_logs
 order by user, query_date

2.

--2) 주차별로 팀 내에서 쿼리를 많이 실행한 수를 구한 후, 실행한 수를 활용해 랭킹을 구해주세요. 단 랭킹이 1등인 사람만 결과가 보이도록 해주세요.

select *
     , rank() over(partition by week_number, team order by query_cnt desc) as team_rank
  from
(
select EXTRACT(WEEK FROM query_date) as week_number
     , team
     , user
     , count(user) as query_cnt     
  from advanced.query_logs
 group by all
  ) as base
qualify team_rank = 1
order by 1,2,3 

3.

--3) (2번 문제에서 사용한 주차별 쿼리 사용) 쿼리를 실행한 시점 기준 1주 전에 쿼리 실행 수를 별도의 컬럼으로 확인할 수 있는 쿼리를 작성해주세요.

select *
     , lag(query_cnt) over(partition by user order by week_number) as prev_week_query_cnt
  from
(
select EXTRACT(WEEK FROM query_date) as week_number
     , team
     , user
     , count(user) as query_cnt     
  from advanced.query_logs
 group by all
  ) as base
 order by user

4.

--4) 시간의 흐름에 따라, 일자별로 유저가 실행한 누적 쿼리 수를 작성해주세요.

select *
     , sum(query_cnt) over(partition by user order by query_date) as cumulative_query_cnt
  from (
        select user
            , team
            , query_date
            , count(user) as query_cnt     
          from advanced.query_logs
        group by all
        ) as base
 order by user

5.

--5) 다음 데이터는 주문 횟수를 나타낸 데이터입니다. 만약 주문 횟수가 없으면 NULL로 기록됩니다. 이런 데이터에서 NULL 값이라고 되어있는 부분을 바로 이전 날짜의 값으로 채워주는 쿼리를 작성해주세요.

WITH raw_data AS (
  SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL
  SELECT DATE '2024-05-02', 13 UNION ALL
  SELECT DATE '2024-05-03', NULL UNION ALL
  SELECT DATE '2024-05-04', 16 UNION ALL
  SELECT DATE '2024-05-05', NULL UNION ALL
  SELECT DATE '2024-05-06', 18 UNION ALL
  SELECT DATE '2024-05-07', 20 UNION ALL
  SELECT DATE '2024-05-08', NULL UNION ALL
  SELECT DATE '2024-05-09', 13 UNION ALL
  SELECT DATE '2024-05-10', 14 UNION ALL
  SELECT DATE '2024-05-11', NULL UNION ALL
  SELECT DATE '2024-05-12', NULL
)

select *
     , ifnull(number_of_orders,last_value(number_of_orders ignore nulls) over(order by date)) as last_value_orders
  from raw_data

6.

--6) 5번 문제에서 NULL을 채운 후, 2일 전 ~ 현재 데이터의 평균을 구하는 쿼리를 작성해주세요(이동 평균)

WITH raw_data AS (
  SELECT DATE '2024-05-01' AS date, 15 AS number_of_orders UNION ALL
  SELECT DATE '2024-05-02', 13 UNION ALL
  SELECT DATE '2024-05-03', NULL UNION ALL
  SELECT DATE '2024-05-04', 16 UNION ALL
  SELECT DATE '2024-05-05', NULL UNION ALL
  SELECT DATE '2024-05-06', 18 UNION ALL
  SELECT DATE '2024-05-07', 20 UNION ALL
  SELECT DATE '2024-05-08', NULL UNION ALL
  SELECT DATE '2024-05-09', 13 UNION ALL
  SELECT DATE '2024-05-10', 14 UNION ALL
  SELECT DATE '2024-05-11', NULL UNION ALL
  SELECT DATE '2024-05-12', NULL
)

select date
     , number_of_orders
     , avg(number_of_orders) over(order by date rows between 2 preceding and current row) as moving_avg
from 
(select date
      , ifnull(number_of_orders,last_value(number_of_orders ignore nulls) over(order by date)) as number_of_orders
   from raw_data) as base

7.

--7) app_logs 테이블에서 Custom Session을 만들어 주세요. 이전 이벤트 로그와 20초가 지나면 새로운 Session을 만들어 주세요. Session은 숫자로 (1,2,3...) 표시해도 됩니다

--2022-08-18일의 user_pseudo_id(1997494153.8491999091)은 session_id가 4까지 나옵니다.

with base as
(
  select event_date
      , event_timestamp
      , datetime(timestamp_micros(event_timestamp), 'Asia/Seoul') as event_datetime
      , event_name
      , user_id
      , user_pseudo_id
      , lag(datetime(timestamp_micros(event_timestamp), 'Asia/Seoul')) over(partition by user_pseudo_id order by event_timestamp) as before_event_datetime
    from advanced.app_logs
)

, diff_data as
(
  select *
       , if(second_diff > 20 or second_diff is null, 1, null) as session_start
    from
      (
        select *
            , DATETIME_DIFF(event_datetime, before_event_datetime, second) as second_diff
          from base
      )
)
 
select *
     , sum(session_start) over(order by event_timestamp) as session_num
  from diff_data  
-- where event_date = '2022-08-18'
--   and user_pseudo_id = '1997494153.8491999091'
order by event_timestamp

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. 케이든님.

추가적으로 도움이 필요하시다면, 위에 제출하신 문제들을 참고하여 아래의 유사한 질문들과 답변 링크를 제공해 드리겠습니다. 이 자료들이 윈도우 함수와 관련한 스터디에 도움이 되길 바랍니다.

  1. 전체 쿼리의 이해 - 윈도우 함수나 대규모 데이터셋에서 집계나 세션 관리를 할 때, 기존의 쿼리를 활용하거나 개선할 수 있는 많은 사례들이 있습니다.

  2. 세션 관리 및 평균 계산 - 세션 관리와 같은 실습에서는 특히 시간 조건을 세분화하는 방법이 중요한데, 이와 관련된 실습 예제들도 참고할 수 있습니다.

  3. 데이터 처리 및 이상치 관리 - 데이터셋에서 누락된 값을 다루거나 이상치를 관리하는 다양한 방법들도 있습니다. 이를 통해 안정적인 데이터 처리가 가능합니다.

질문하신 부분들은 윈도우 함수와 세션 관리에 관련한 강의의 심화 연습 문제로 보여집니다. 위 링크들에서는 이러한 주제와 관련된 유용한 예제와 설명을 제공하고 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최종 과제 제출

0

82

3

BigQuery 활용편 18강 질문있습니다!

0

84

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

83

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

73

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

69

2

윈도우 연습문제 1번 질문

0

65

1

user_id에 NULL이 나오는데 정상인가요?

0

72

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

106

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2