inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

102

sjb2774

작성한 질문수 4

0

문제 1번

-- 1. 사용자별 쿼리를 실행한 횟수의 총합
-- GROUP BY 사용 X. 우측에 새로운 컬럼 생성하기.

SELECT 
  user
  , team
  , query_date
  , COUNT(query_date) OVER (PARTITION BY user) AS total_query_cnt
FROM advanced.query_logs
ORDER BY user, query_date;

 

문제 2번

-- 2. 주차별로 팀내에서 쿼리를 많이 실행한 수 → 랭킹 구하기
-- 팀별로 랭킹이 1위인 사람만 출력하기

WITH base AS (
  SELECT 
    EXTRACT(week FROM query_date) AS week_number
    , user
    , team
    , COUNT(query_date) AS total_query_cnt
  FROM advanced.query_logs
  GROUP BY week_number, user, team
)

SELECT 
  week_number
  , team
  , user
  , total_query_cnt
  , RANK() OVER (PARTITION BY team ORDER BY total_query_cnt DESC) AS ranking_in_team
FROM base
QUALIFY ranking_in_team = 1
ORDER BY week_number, team; 

 

문제 3번

-- 3. (2번 문제에서 사용한 주차별 쿼리 사용) 쿼리를 실행한 시점
-- 1주 전에 쿼리를 실행한 횟수를 별도의 컬럼으로 출력

WITH base AS (
  SELECT 
    EXTRACT(week FROM query_date) AS week_number
    , user
    , team
    , COUNT(query_date) AS query_cnt
  FROM advanced.query_logs
  GROUP BY week_number, user, team
)

SELECT 
  user
  , team
  , week_number
  , query_cnt
  , LAG(query_cnt) OVER (PARTITION BY user ORDER BY week_number) AS prev_week_query_cnt
FROM base 
ORDER BY user, week_number;

 

문제 4번

-- 4. 일자별 유저가 쿼리한 횟수 누적합

SELECT 
  user
  , team
  , query_date
  , query_count
  , SUM(query_count) OVER (PARTITION BY user ORDER BY query_date 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_query_count
FROM (
  SELECT 
    user 
    , team
    , query_date
    , COUNT(query_date) AS query_count
  FROM advanced.query_logs
  GROUP BY 1,2,3
)
ORDER BY user, query_date;

 

문제 5번

-- 주문 횟수 테이블: 데이터 없으면 NULL로 표기됨.
-- 5. 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 
  date
  , LAST_VALUE(number_of_orders ignore nulls) OVER (ORDER BY date) AS number_of_orders
FROM raw_data;

 

문제 6번

-- 6. (5번 완료 후) 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
    , LAST_VALUE(number_of_orders ignore nulls) OVER (ORDER BY date) AS number_of_orders
  FROM raw_data
)

 

문제 7번

-- 7. app_logs 테이블에서 커스텀 세션 추가 
-- 이전 이벤트 로그와 20초 이상 차이가 나면 새로운 세션으로 정의
-- 세션은 숫자로(1,2,3...) 표시 가능

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
  WHERE 1=1
  AND event_date = '2022-08-18'
)

SELECT
    *
    ,DATETIME_DIFF(event_datetime, before_event_datetime, SECOND) AS second_diff
    , CASE WHEN 
        DATETIME_DIFF(event_datetime, before_event_datetime, SECOND) IS NULL
            OR DATETIME_DIFF(event_datetime, before_event_datetime, SECOND) >= 20 THEN 1 
        ELSE 0 
      END AS session_start
    , SUM(CASE WHEN DATETIME_DIFF(event_datetime, before_event_datetime, SECOND) >= 20 THEN 1 ELSE 0 END)
        OVER (PARTITION BY user_pseudo_id ORDER BY event_datetime) + 1 AS session_temp
FROM base

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

인프런 AI 인턴

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

BigQuery의 SQL을 활용하여 윈도우 함수를 통한 랭킹 및 사용자별 쿼리 실행 횟수를 집계하는 과제에 대해 질문해주셨군요. 이와 관련하여 도움이 될 수 있는 유사한 질문과 답변을 찾아보았습니다.

아래의 링크를 참조하세요:

  1. 3-7 리텐션 SQL 쿼리 작성하기 연습 (Weekly, Monthly)

    • 이 게시물에서는 리텐션 분석을 위한 SQL 쿼리를 작성하는 방법에 대해 다루고 있습니다. 특히 FIRST_VALUE와 같은 윈도우 함수를 사용하는 방법이 논의되어 있어 도움이 될 수 있을 것입니다.
  2. 1-9. 퍼널 SQL 쿼리 작성하기

    • 퍼널 분석을 위한 SQL 쿼리 작성 시, RANKPARTITION BY와 같은 윈도우 함수를 활용하여 데이터의 특정 조건에 따라 집계하는 방법이 자세히 설명되어 있습니다.

위의 링크들을 통해 주어진 문제 의도를 더 명확히 이해하고, SQL 쿼리를 개선하는 데 도움이 되길 바랍니다.

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

최종 과제 제출

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

107

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2