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

매드재원님의 프로필 이미지
매드재원

작성한 질문수

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

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

작성

·

28

0

연습 문제 1

데이터 테이블 : query_logs

 

사용자별 쿼리를 실행한 총 횟수를 구하는 쿼리를 작성해주세요. 
단, group by 를 사용해서 집계하는 것이 아닌 query_logs의 데이터의 우측에 새로운 컬럼을 만들어주세요. 
-- 사용자별 쿼리를 실행한 총 횟수 : count() 전체 실행
-- over(partition by user)

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

 

 결과 

 

 

연습 문제 2

데이터 테이블 : query_logs

주차별로 팀 내에 쿼리를 많이 실행한 수를 구한 후, 실행한 수를 활용해 랭킹을 구해주세요.

단, 랭킹이 1등인 사람만 결과가 보이도록 해주세요.

with query_cnt_by_team 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, team order by query_cnt desc) as rk
from query_cnt_by_team
  -- qualify : 윈도우 함수의 조건을 설정할 때 사용한다. 
  -- where 을 쓸 수 있지만 그럴 경우 서브쿼리를 활용해야함
qualify rk = 1
order by week_number, team, query_cnt desc
--

 

결과 

 

 

 

연습 문제 3

데이터 테이블 : 2번 문제에서 사용한 주차별 쿼리 사용

쿼리를 실행한 시점 기준 1주 전에 쿼리 실횅수를 별도의 컬럼으로 확인할 수 있는 쿼리를 작성해주세요.

with query_cnt_by_team 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,1) over(partition by user order by week_number) as prev_week_qeury_cnt
from query_cnt_by_team

-- over(partition by user)

 

결과 

 

 

 

연습 문제 4

시간의 흐름에 따라, 일자별로 유저가 실행한 누적 쿼리 수를 작성해 주세요.

--누적 쿼리 : 과거의 시간(unbounded preceding) 부터 curren row 까지
--출제 의도 : default frame에 대해 알려드리고 싶었음.
select *,
      sum(query_cnt) over(partition by user order by query_date) as cumulative_sum,
      sum(query_cnt) over(partition by user order by query_date rows between unbounded preceding and current row) as cumulative_sum2
-- frame의 default 값 : unbounded preceding ~~ current row
from(
select 
  query_date, 
  team, 
  user,
  count(user) as query_cnt
from advanced.query_logs
group by all)
-- # qualify cumulative_sum != cumulative_sum2
--where, qualify 조건 설정해서 2가지 값이 모두 같은지 비교 => 모두 같으면 != 연산 결과에 반환하는 값이 없을 것 
order by user, query_date

 

결과 

 

 

 

 

연습 문제 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
)

-- 윈도우 함수의 first_value, last_value 에선 기본적으로 null을 포함해서 연상 

-- null을 제외하고 싶으면 ignore nulls  함수를 쓰자

--ignore x
select *, last_value(number_of_orders) over(order by date) as last_value_orders
from raw_data

결과 

 

 

 

-- ignore 사용
select *, last_value(number_of_orders ignore nulls ) over(order by date) as last_value_orders
from raw_data

 

결과 

 

 

 

 

연습 문제 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
)
, filled_data as(
select *, last_value(number_of_orders ignore nulls ) over(order by date) as number_orders
from raw_data)
-- with 문을 또 쓸 수 없으니 , 로 구분해 주면 된다. 
select * , avg(number_of_orders) over(order by date rows between 2 preceding and current row) as moving_avg
from filled_data
-- frame: 2일 전 => between 2 preceding and current row

 

결과 

 

 


답변 1

0

안녕하세요, 인프런 AI 인턴입니다. 매드재원님.

BigQuery의 윈도우 함수 연습 문제를 통해 쿼리 작성 및 데이터 처리에 대한 이해를 높이려는 노력이 인상적입니다. 윈도우 함수는 복잡한 데이터 분석 작업을 간단하게 처리하는 매우 강력한 도구입니다. 각 문제에 대해 차근차근 쿼리를 작성하시며 좋은 결과를 얻으신 것 같습니다.

아래는 윈도우 함수와 관련된 기존의 관련 질문과 답변을 포함한 링크입니다. 이러한 자료들이 매드재원님의 이해를 더욱 돕고, 도움이 되기를 바랍니다.

  1. 2-11. 윈도우 함수 연습 문제(2번~6번) - ROWS와 RANGE의 차이점 이해하기

    • 윈도우 함수의 ROWS와 RANGE의 차이 및 활용에 대해 설명하고 있습니다.
  2. 퍼널별 유저들의 새로운 세션 시작 횟수 계산하기

    • 윈도우 함수와 다른 SQL 기능을 사용하여 데이터를 분석하는 방법을 설명하고 있습니다.

이러한 자료는 빈도 분석 및 이동 평균을 포함한 다양한 윈도우 함수 활용 예제를 제공합니다. 계속해서 궁금한 점이 있으시면 질문해 주세요. 곧 지식공유자께서 귀중한 답변을 주실 것입니다.

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

매드재원님의 프로필 이미지
매드재원

작성한 질문수

질문하기