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

권기영님의 프로필 이미지
권기영

작성한 질문수

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

2-12. 섹션 정리

빠짝스터디 2주차 과제 윈도우 함수

작성

·

42

0

윈도우 함수 연습문제 1

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

윈도우 함수 연습문제 2

select 
*,
rank() over(partition by team, week_number order by query_cnt desc) as team_rank
from
(
  select 
  user,
  week_number,
  team,
  count(*) as query_cnt
  from
  (
    select 
    *,extract(week from query_date) as week_number
    from `advanced.query_logs`
  )
  group by all
)
qualify team_rank=1;

윈도우 함수 연습문제3

select 
*,
lag(query_cnt) over(partition by user order by week_number asc) as prev_week_query_cnt
from
(
  select 
  user,
  week_number,
  team,
  count(*) as query_cnt
  from
  (
    select 
    *,extract(week from query_date) as week_number
    from `advanced.query_logs`
  )
  group by all
);

윈도우 함수 연습문제4

select
*,
sum(query_count) over(partition by user order by query_date asc) as cumulative_query_cnt
from
(
  select
  user,
  query_date,
  team,
  count(*) as query_count
  from `advanced.query_logs`
  group by all
);

윈도우 함수 연습문제5

SELECT
 date,
 case
   when number_of_orders is null then lag(number_of_orders) over(order by date asc) 
   else number_of_orders
 end as number_of_orders
 FROM raw_data;

윈도우 함수 연습문제6

select 
*,
avg(number_of_orders) over(order by date asc rows between 2 preceding and current row) as moving_average
from
(
  SELECT
  date,
  case
    when number_of_orders is null then lag(number_of_orders) over(order by date asc) 
    else number_of_orders
  end as number_of_orders,
  FROM raw_data
)
;

윈도우 함수 연습문제7

select 
*,
sum(session_start) over(partition by user_pseudo_id order by event_timestamp asc) as session_id
from
(
  select
  *,
  case
  when time_diff is null then 1
  when time_diff >= 20 then 1
  else null
  end as session_start
  from
  (
    select
    *,
    cast((event_timestamp - before_event_timestamp)/1000000 as int) as time_diff
    from
    (
      select
      event_date,
      event_timestamp,
      event_name,
      user_id,
      user_pseudo_id,
      lag(event_timestamp) over(partition by user_pseudo_id order by event_timestamp asc) as before_event_timestamp
      from
      `advanced.app_logs`
      where user_pseudo_id='1997494153.8491999091' and event_date='2022-08-18'
    )
  )
);

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 권기영님께서 빅쿼리 강의에서 윈도우 함수에 대한 연습문제들을 작성하신 것 같네요. 여러 유형의 윈도우 함수가 각 문제에 사용되어 있습니다. 이번엔 각 연습문제의 핵심 개념을 간단히 정리해보겠습니다. 답변이 도움이 되길 바랍니다.

  1. 연습문제 1: PARTITION BY를 사용하여 각 user별로 쿼리 수(total_query_cnt)를 계산합니다. 이는 특정 열을 기준으로 그룹화하여 그 그룹 내의 행 수를 구하는 일반적인 사용 예입니다.

  2. 연습문제 2: RANK() 윈도우 함수를 통해 팀과 주간 수(week_number)를 기준으로 각 팀의 쿼리 수(query_cnt)에 대한 순위를 계산하고, QUALIFY를 사용하여 1위만을 필터링합니다. 이는 특정 조건에 맞는 랭킹을 추출하는 방법입니다.

  3. 연습문제 3: LAG() 함수를 사용하여 각사용자의 이전 주 쿼리 수를 가져옵니다. 이는 시계열 데이터에서 이전 값과 비교해야 할 때 유용합니다.

  4. 연습문제 4: SUM() 윈도우 함수를 사용하여 각 사용자별 누적 쿼리 수를 계산합니다. 이는 누적 값이나 점진적으로 증가하는 값을 볼 때 유용합니다.

  5. 연습문제 5: LAG()를 활용하여 주문 수(number_of_orders)가 없는 경우 이전 행의 값을 대체하는 방식으로 결측값을 처리합니다. 이는 데이터의 공백을 줄이고 연속된 데이터 처리를 위해 사용됩니다.

  6. 연습문제 6: 이동 평균을 구하기 위해 ROWS BETWEEN을 사용하여 주어진 범위 내의 값을 평균으로 계산합니다. 이는 데이터의 추세나 패턴을 분석할 때 유용합니다.

  7. 연습문제 7: SUM()CASE 문을 함께 사용하여 사용자의 세션 시작을 판별하고, time_diff를 통해 특정 시간을 기준으로 새로운 세션을 식별합니다. 이는 사용자 행동의 시작과 종료를 파악하는데 적절한 방법입니다.

각 코드들이 잘 작성되어 있습니다. 이러한 연습문제를 통해 빅쿼리의 다양한 윈도우 함수 사용법을 익히게 되실 것으로 보입니다. 문제를 진행하면서 특정 부분이 이해되지 않거나 추가 설명이 필요하시면 언제든지 다시 질문해 주세요. 추가로 관련 학습 내용을 더 알고 싶다면, 아래 유사한 질문과 답변 URL이 도움이 될 수 있습니다.

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

권기영님의 프로필 이미지
권기영

작성한 질문수

질문하기