inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

2-11. 윈도우 함수 연습문제 7번

해결된 질문

138

jenna

작성한 질문수 13

0

DATETIE_DIFF 함수 사용할 때 오류가 발생합니다

무엇이 잘못되었을까요..?

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 FROM advanced.app_logs ) , prev_event_datetime AS ( SELECT *, LAG(event_datetime) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS prev_event_datetime FROM base ) SELECT *, DATETIME_DIFF(event_datetime,prev_event_datetime, SECOND) AS second_diff FROM prev_event_datetime

sql Google-Analytics firebase google-sheets bigquery

답변 2

0

카일스쿨

jenna님 안녕하세요. 쿼리 질문을 해주실 때는 쿼리를 코드 블럭에 넣어주시면 제가 확인할 때 더 빠르게 확인할 수 있어요.

 

오류가 발생한다고 말씀해주셨는데, 오류도 같이 작성을 해주시면 더 빠르게 확인할 수 있답니다. 다음엔 오류를 같이 알려주시면 좋을 것 같아요

 

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
        FROM
            advanced.app_logs
    ),
    prev_event_datetime AS (
        SELECT
            *,
            LAG(event_datetime) OVER (
                PARTITION BY user_pseudo_id 
                ORDER BY event_datetime
            ) AS prev_event_datetime
        FROM
            base
    )
SELECT
    *,
    DATETIME_DIFF(event_datetime, prev_event_datetime, SECOND) AS second_diff
FROM
    prev_event_datetime

 

쿼리를 돌려보니 다음과 같은 오류가 나오네요.

No matching signature for function DATETIME_DIFF for argument types: DATETIME, STRUCT<event_date DATE, event_timestamp INT64, event_datetime DATETIME, ...>, DATE_TIME_PART. Supported signatures: DATETIME_DIFF(DATETIME, DATETIME, DATE_TIME_PART); DATETIME_DIFF(TIMESTAMP, TIMESTAMP, DATE_TIME_PART) at [25:5]

 

이 오류를 번역해보면(번역기를 활용)

인자 유형에 대한 함수 DATETIME_DIFF에 일치하는 서명이 없습니다: DATETIME, STRUCT<event_date DATE, event_timestamp INT64, event_datetime DATETIME, ...>, DATE_TIME_PART. 지원되는 서명: DATETIME_DIFF(DATETIME, DATETIME, DATE_TIME_PART); DATETIME_DIFF(TIMESTAMP, TIMESTAMP, DATE_TIME_PART) at [25:5].

 

DATETIME_DIFF에 들어가는 인자의 타입이 다르다는 의미입니다. 현재 DATETIME, STRUCT<event_date DATE, event_timestamp INT64, event_datetime DATETIME, ...>, DATE_TIME_PART 형태의 데이터가 들어가있다고 합니다. 지원되는 서명이 올바른 형태의 데이터 포맷입니다.

 

그럼 DATETIME_DIFF 쿼리를 보러 가보면, 다음과 같이 사용하고 있습니다

    DATETIME_DIFF(event_datetime, prev_event_datetime, SECOND) AS second_diff

 

prev_event_datetime가 어디에 저장되어 있나 보니, WITH 문에 정의가 되어있어요.

 

스크린샷 2024-10-13 오후 11.44.36.png

 

즉, 여기서 보면 DATETIME_DIFF에 prev_event_datetime 컬럼이 아니라 WITH문에 정의한 CTE를 명시한겁니다. 그래서 데이터가 안맞아서 오류가 발생했습니다. 여기선 WITH문에 정의한 prev_event_datetime의 이름을 바꾸거나 그 안의 컬럼 이름을 바꾸면 됩니다. 동일한 이름을 가진 값이 있으면 BigQuery가 잘못 이해하기 때문에 같은 이름을 사용하지 않으셔야 해요

 

강의에서 나온 이름을 동일하게 사용하시면 문제가 되지 않을거에요.

 

 

 

0

jenna

동일한 이름 값을 사용하면 안되는 것이었군요!

이렇게 또 하나 배울 수 있어서 감사합니다!

다음부터 쿼리 질문할 때 꼭 코드 블럭과 오류작성하겠습니다!!!

 

0

인프런 AI 인턴

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

DATETIME_DIFF 함수 사용 시 오류가 발생한다고 말씀해 주셨네요. 일반적으로 이 오류는 함수에 전달된 인자 유형이 잘못되어 발생할 수 있습니다. event_datetimeprev_event_datetime이 모두 DATETIME 형식이어야 합니다. 오류의 원인과 해결 방안을 함께 살펴보겠습니다.

확인 사항:

  1. DATETIME 형식 확인: event_datetimeprev_event_datetime 모두 DATETIME 형식이어야 합니다.
  2. NULL 값 처리: prev_event_datetimeNULL인 경우, DATETIME_DIFF 함수에서 오류가 발생할 수 있습니다. 이 경우, NULL을 처리하기 위한 IFNULL 또는 COALESCE 함수 사용을 고려해야 합니다.

예시 코드 수정:

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
  FROM advanced.app_logs
),
prev_event_datetime AS (
  SELECT
    *,
    LAG(event_datetime) OVER(PARTITION BY user_pseudo_id ORDER BY event_datetime) AS prev_event_datetime
  FROM base
)
SELECT
  *,
  DATETIME_DIFF(event_datetime, IFNULL(prev_event_datetime, event_datetime), SECOND) AS second_diff
FROM prev_event_datetime

위 코드에서 IFNULL(prev_event_datetime, event_datetime) 부분은 이전 이벤트 시간이 NULL인 경우 차이를 0으로 처리하기 위한 부분입니다.

혹시 위 방법으로도 문제가 해결되지 않는다면, 데이터셋의 정확한 데이터 형식이나 콘솔에서의 오류 메시지를 확인해 보는 것도 추천드립니다.

아래 유사한 주제를 다룬 링크에서 좀 더 정보를 확인해 보세요:

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

최종 과제 제출

0

82

3

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

0

84

1

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

0

83

2

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

0

75

2

biquery 테이블 생성 오류 이슈

0

55

2

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

0

74

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

73

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