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

SungWoo Park님의 프로필 이미지
SungWoo Park

작성한 질문수

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

2-11. 윈도우 함수 연습 문제(1번)

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

작성

·

28

0

문제 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 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
	*,
	LAG(query_cnt) OVER (PARTITION BY user ORDER BY week_number) AS prev_week_query_cnt
FROM table

문제4.

WITH query_count_table AS (
	SELECT
		*,
		COUNT(*) AS query_count
	FROM advanced.query_logs
	GROUP BY ALL
)

SELECT
	*,
	SUM(query_count) OVER (PARTITION BY user ORDER BY query_date) AS cululative_query_count
FROM query_count_table

문제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,
		 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'
		 AND user_pseudo_id = "1997494153.8491999091"
		 
), diff_data AS(
SELECT
	*,
	
	DATETIME_DIFF(event_datetime, prev_event_datetime, SECOND) AS second_diff
FROM
	(
	SELECT
		*,
		# 직전 이벤트 시간을 prev_event_datetime으로 만들기
		LAG(event_datetime, 1) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS prev_event_datetime
	FROM base
)
)
SELECT
	*,
	SUM(session_start) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS session_num 
FROM(
	SELECT
		*,
		CASE 
			WHEN prev_event_datetime IS NULL THEN 1
			WHEN second_diff >= 20 THEN 1
			ELSE NULL
			END AS session_start
	FROM diff_data
)
ORDER BY event_datetime

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. SungWoo Park님께서 SQL 윈도우 함수 관련한 연습문제에 대해 질문 주셨네요. 여러 문제에 대한 예제를 잘 작성해 주셨습니다. 각 문제에 대한 간단한 설명과 함께 몇 가지 추가적인 정보를 드리겠습니다.

문제 1.

  • COUNT(query_date) OVER (PARTITION BY user ORDER BY user): 사용자별로 쿼리 로그의 날짜를 계수합니다. ORDER BY user 부분은 특별한 의미를 부여하기 어렵겠네요. 사용자별 총 쿼리 수를 구하려면 ORDER BY 없이 단순히 PARTITION BY user 만 필요한 경우가 많습니다.

문제 2.

  • RANK() OVER(PARTITION BY week_number ORDER BY query_cnt): 주차별 쿼리 횟수에 따라 팀을 순위 매기고 있습니다.
  • QUALIFY: 1위 팀을 추출합니다. 하지만 ORDER BY query_cnt DESC로 해야 가장 높은 쿼리 횟수를 가진 팀이 1위로 랭크됩니다.

문제 3.

  • LAG(query_cnt) OVER (PARTITION BY user ORDER BY week_number): 각 사용자의 주간 쿼리 횟수를 이전 주의 쿼리 횟수와 비교합니다. 문제없이 잘 작동합니다.

문제 4.

  • 누적 쿼리 카운트를 계산합니다. SUM(query_count) OVER (PARTITION BY user ORDER BY query_date) 구문이 잘 사용되었습니다.

문제 5 & 6.

  • 누락된 주문 수를 마지막 비어있지 않은 값을 채우는 방법을 적용하여, 문제가 없습니다.
  • moving_avg: 주어진 날짜의 이동 평균을 구하며, 과거의 두 날과 현재날을 기준으로 세 날의 평균을 구합니다.

문제 7.

  • 두 이벤트 사이의 시간 차이를 계산하여 사용자의 세션을 구별합니다. SESSION의 시작점을 정의하는 방법이 잘 작성되어 있습니다.

각 문제에서 윈도우 함수나 SQL 구문에 대한 더 많은 도움이나 예제가 필요하실 경우, 다음의 게시물을 참고해보세요:

  1. 3-7 리텐션 SQL 쿼리 작성하기 연습 (Weekly, Monthly): 윈도우 함수를 활용한 리텐션 분석.
  2. 리텐션 연습 문제: 리텐션 쿼리에서 발생할 수 있는 문제를 토론합니다.
  3. 3-7. Weekly 리텐션 쿼리 작성 및 질문: 리텐션 쿼리 작성 시 참고할 수 있는 예제입니다.

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

SungWoo Park님의 프로필 이미지
SungWoo Park

작성한 질문수

질문하기