inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

4-3. BigQuery의 절차적 언어(Precodural Language) : DECLARE, SET, EXECUTE, IMMEDIATE

4-3 EXECUTE IMMEDIATE 쿼리

해결된 질문

146

jenna

작성한 질문수 13

0

DECLARE custom_event STRING DEFAULT 'screen_view';
SELECT 
 COUNT(*) AS output
FROM advanced.app_logs
WHERE 
 event_date = '2022-08-01'
 AND
 event_name = custom_event
GROUP BY ALL 

sql Google-Analytics firebase google-sheets bigquery

답변 1

0

카일스쿨

안녕하세요. EXECUTE IMMEDIATE에도 DECLARE를 사용해서 주입합니다

 

말씀하신 케이스는 다음과 같네요

  • (1) DECLARE를 사용한 후, 쿼리에서 변수를 바로 사용한 경우

  • (2) DECLARE를 사용한 후, EXECUTE IMMEDIATE를 사용한 경우

     

     

  • (1) DECLARE를 사용한 후, 쿼리에서 변수를 바로 사용한 경우

    • 변수를 선언하고 쿼리에서 참조

    • 쿼리 실행 시점에 값이 고정됩니다

       

  • (2) DECLARE를 사용한 후, EXECUTE IMMEDIATE를 사용한 경우

    • 쿼리가 실행될 때 변수가 주입

      • 쿼리 구조가 달라질 수 있을 때 유용합니다. 필요한 컬럼이 매번 달라지는 경우

    • 테이블 이름이나 컬럼 이름 등 SQL 구문 자체를 동적으로 변경할 때 사용합니다

    • 강의의 예시는 간단해서 두개가 유사하게 보일 수 있는데, 동적으로 컬럼을 조합해야 할 때 유용합니다

    • 아래 글에 예시를 작성해두었어요(다만 쿼리가 좀 어려운 것처럼 느껴질 수 있어요)

  DECLARE station_ids STRING;
  SET station_ids = (
      SELECT
        CONCAT('("', STRING_AGG(SAFE_CAST(start_station_id AS STRING), '", "'), '")')
      FROM (
        SELECT 
      DISTINCT start_station_id
        FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
        WHERE start_station_id IS NOT NULL 
        ORDER BY start_station_id
      )
  );
  EXECUTE IMMEDIATE format("""
  WITH BASE AS (
  SELECT 
    DATE(start_time) AS start_date,
    start_station_id,
    trip_id
  FROM `bigquery-public-data.austin_bikeshare.bikeshare_trips`
  WHERE 
    DATE(start_time) BETWEEN "2015-10-01" AND "2015-10-07"
    AND start_station_id IS NOT NULL
  )
  SELECT * 
  FROM base #1 from 절
  PIVOT
  (
    -- #2 집계 함수
    COUNT(trip_id) AS trip_cnt
    -- #3 피벗할 컬럼
    FOR SAFE_CAST(start_station_id AS STRING) in %s
  )
  ORDER BY start_date
  """, station_ids);

 

  • station_ids를 %s에 주입하고, station_ids는 ("1001", "1002", ...) 여러 값이 들어갈 수 있고, 시간이 지나면서 달라질 수 있을거에요. SET station_ids를 할 때 SELECT로 가지고 오거든요.

 

정리하면

  • 하나 정의해서 쓰는 것은 둘 다 비슷

  • SELECT 문으로 결과를 가지고 와서 쿼리문에 주입할 때 EXECUTE IMMEDIATE를 사용. 좀 더 유연하고 동적으로 변할 수 있는 경우 유용

    • 다만 이 부분은 어렵게 느껴질 수 있는데, 난이도로 분류하면 제일 어려운 난이도에 들어가는 쿼리문입니다. 쿼리를 천천히 보셔요.

    • 핵심은 동적으로 사용할 때 EXECUTE IMMEIDATE가 더 유용하다입니다.

최종 과제 제출

0

82

3

BigQuery 활용편 18강 질문있습니다!

0

84

1

리텐션 공부하다가 궁금한게 생겨 질문드립니다

0

83

2

안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다

0

73

2

[과제] 퍼널 PIVOT 테이블 작성하기

0

67

2

array 등

0

63

2

N day 리텐션 쿼리 관련 질문

0

63

2

이동평균 계산 시 order by 기본값은 뭔가요?

0

69

2

윈도우 연습문제 1번 질문

0

65

1

user_id에 NULL이 나오는데 정상인가요?

0

72

2

3-13 리텐션 과제 제출

0

94

2

최종 과제 제출

0

130

3

weekly retention 구하기 과제

0

90

2

1-9. 피벗 쿼리 작성

0

81

2

app_logs 테이블 생성 문제

0

73

2

Weekly Retention 구하기 완성하였습니다.

0

77

2

[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료

0

107

2

3-7 Weekly, Monthly Retention 쿼리 작성

0

92

2

정성 데이터 분석 방법 문의

0

165

1

최종 과제 제출

0

108

3

1-6 예시 문제 풀이

0

69

2

최종과제 제출

0

145

2