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

Luck Good님의 프로필 이미지
Luck Good

작성한 질문수

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

[인프런 빅쿼리 빠짝스터디 2주차] 윈도우함수 연습문제

작성

·

30

0

1. 윈도우 함수 연습문제 1번

/* 1. 사용자별 쿼리를 실행한 횟수의 총합을 보여주는 쿼리를 작성하세요 
 단, GROUP BY를 통해 집계하는게 아니라 우측에 새로운 칼럼으로 만들어주세요 */

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번

/* 2. 주차별로 팀내에서 쿼리를 많이 실행한 수를 구한 후, 실행한 수를 활용해
랭킹을 구해주세요. 단, 팀별로 랭킹이 1위인 사람만 보여주세요 */

-- 풀이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,
  ranking_in_team
from (
  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 
)
where 
  ranking_in_team = 1
order by  
  week_number, team; 

-- 풀이2: QUALIFY 사용

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번


/* 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번


/* 4. 시간의 흐름별로(일자별로) 유저가 쿼리한 횟수의 누적합을 구하세요 */

select 
  user,
  team,
  query_date,
  query_count,

-- 윈도우함수의 FRAME의 DEFAULT값이 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW임
  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. 윈도우 함수 연습문제 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 
  date,
  last_value(number_of_orders ignore nulls) over (order by date) as number_of_orders
from   
  raw_data;

-- 기본적으로 FIRST_VALUE, LAST_VALUE 연산시에 NULL도 포함하여 출력하지만
-- IGNORE NULLS를 사용하면 NULL 제외한 값으로 출력됨 

6. 윈도우 함수 연습문제 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,
    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 
    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

답변 1

0

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

윈도우 함수 관련 연습문제를 푸시면서 여러 가지 SQL 기술을 성공적으로 활용하신 것 같습니다. 윈도우 함수는 특히 데이터 처리 및 분석에 매우 강력한 도구요, 이번 기회에 이러한 함수들의 다양한 활용 방법을 익히게 되신 듯합니다.

해당 문제들에 대해 연관된 유사 질문과 답변을 안내해드립니다. 이 자료들이 문제 풀이와 이해에 더욱 도움이 되기를 바랍니다.

  1. BigQuery 윈도우 함수 - 총합 및 누적 합계 쿼리 예제

    • 윈도우 함수를 사용하여 누적 합계 등을 계산하는 과정에서 ‘ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW’의 중요성과 사용 방법을 이해하는 데 도움이 됩니다.
  2. 윈도우 함수 활용 - 이동 평균 및 순위 산출 사례

    • 랭킹 및 이동 평균 등을 다루는 사례로, 다양한 윈도우 함수의 응용 방법을 배울 수 있습니다.
  3. 커스텀 세션 생성 관련 문제 해결 방법

    • 이벤트 간 시간 차이를 이용하여 새로운 세션을 정의하는 방법에 대한 토론이 포함되어 있습니다.

윈도우 함수를 비롯한 여러 SQL 기능을 잘 활용하셔서 분석 능력을 더욱 키워나가시길 바랍니다. 필요한 경우, 추가적인 설명이나 궁금하신 점에 대해 언제든지 질문해 주세요. 지식공유자께서도 곧 답변해 주실 것입니다.

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

Luck Good님의 프로필 이미지
Luck Good

작성한 질문수

질문하기