인프런 커뮤니티 질문&답변

진혁님의 프로필 이미지
진혁

작성한 질문수

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

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

작성

·

12

0

문제 1. 

SELECT *,
lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month,   lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month, 
FROM   advanced.analytics_function_01  

문제 2. 

SELECT *,
  lead(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_1month,
  lead(visit_month, 2) OVER(PARTITION BY user_id ORDER BY visit_month) AS next_2month,
  lag(visit_month, 1) OVER(PARTITION BY user_id ORDER BY visit_month) AS pre_1month
FROM
  advanced.analytics_function_01

문제 3. 

SELECT *,
SUM(amount) OVER (PARTITION BY user_id ORDER BY order_date, order_id
) AS cumulative_sum_by_user

문제 4. 

SELECT *,
AVG(amount) OVER (ORDER BY order_date, order_id 
ROWS BETWEEN 5 PRECEDING AND 1 PRECEDING) AS last_5_orders_avg_amout

문제 1. 

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

문제 2. 

WITH table AS (
SELECT
	EXTRACT(WEEK FROM query_date) AS week_number,
	team,
	user,
	COUNT(user) AS query_cnt
FROM advanced.query_logs
GROUP BY ALL
)

SELECT *,
RANK() OVER(PARTITION BY week_number ORDER BY query_cnt) AS team_rank
FROM table
QUALIFY team_rank = 1

문제 3. 

WITH base AS (
  SELECT
    EXTRACT(week FROM query_date) AS week_number,
    team,
    user,
    count(user) AS query_cnt
  FROM
    advanced.query_logs
  GROUP BY
    1,2,3
)
SELECT *,
  lag(query_cnt) OVER(PARTITION BY team, user ORDER BY week_number asc) AS prev_week_query_cnt
FROM base
QUALIFY team_rank = 1


문제 4. 

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

문제 5.

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,
  IF(number_of_orders is null , last_value(number_of_orders IGNORE NULLS) OVER(ORDER BY date asc), number_of_orders) AS number_of_orders_not_null
FROM
  raw_data;

문제 6.

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
),
filled_data AS (

  SELECT 
    * EXCEPT(number_of_orders), 
    LAST_VALUE(number_of_orders IGNORE NULLS) OVER (ORDER BY date) AS number_of_orders
  FROM raw_data

)

SELECT 
  *, 
  AVG(number_of_orders) OVER (ORDER BY date ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS moving_avg
FROM filled_data

문제 7.

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
  FROM
    advanced.app_logs
  WHERE
    event_date = '2022-08-18'
), diff_date AS (
  SELECT
    *,
    DATETIME_DIFF(event_datetime, pre_event_time, second) AS date_diff_sec
  FROM (
    SELECT
      *,
      LAG(event_datetime, 1) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime asc) AS pre_event_time
    FROM
      base
  )
), session_start AS (
SELECT
  *,
  CASE
    WHEN pre_event_time IS NULL THEN 1
    WHEN date_diff_sec >= 20 THEN 1
  END AS start_session
FROM
  diff_date
)
SELECT
  event_date,
  event_datetime,
  event_name,
  user_id,
  user_pseudo_id,
  date_diff_sec,
  SUM(start_session) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_id
FROM
  session_start
ORDER BY
  user_pseudo_id, event_datetime;

답변 1

0

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

‘sql’과 관련된 ‘BigQuery’에서 윈도우 함수와 관련된 다양한 문제를 해결해보셨네요. 문제에서 윈도우 함수를 사용하는 것은 데이터의 흐름을 이해하고 분석할 때 매우 유용한 기법입니다.

각 문제에 대한 간략한 설명을 드리면 다음과 같습니다:

  1. LEAD/LAG 함수 사용: 주어진 테이블에서 LEADLAG 함수를 사용하여 사용자 ID별 방문 월을 기준으로 전후의 데이터를 조회하는 것과 관련이 있습니다. 이 함수들은 데이터의 시퀀스를 파악하는 데 사용됩니다.

  2. 누적합 및 이동 평균: 특정 사용자의 주문 내역이나 쿼리 로그 같은 데이터를 누적합으로 계산하거나, 지정된 범위의 이동 평균을 계산하여 패턴을 찾는 데 사용됩니다.

  3. NULL 값 처리 및 세션 식별: 주어진 데이터에서 NULL을 이전의 유효한 값으로 채워주거나, 사용자의 이벤트 로그를 기반으로 세션을 식별하는 방법입니다.

이를 통해 데이터에서의 트렌드를 분석하거나 예외 사항을 쉽게 찾을 수 있게 됩니다.

그리고 다음의 게시물들은 유사한 주제를 다루고 있어 도움이 될 수 있습니다:

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

진혁님의 프로필 이미지
진혁

작성한 질문수

질문하기