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

jenna님의 프로필 이미지

작성한 질문수

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

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

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

해결된 질문

24.10.13 16:05 작성

·

36

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

답변 2

0

카일스쿨님의 프로필 이미지
카일스쿨
지식공유자

2024. 10. 13. 23:49

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가 잘못 이해하기 때문에 같은 이름을 사용하지 않으셔야 해요

 

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

 

 

 

jenna님의 프로필 이미지
jenna
질문자

2024. 10. 14. 16:22

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

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

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

 

0

인프런 AI 인턴님의 프로필 이미지

2024. 10. 13. 16:11

안녕하세요, 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으로 처리하기 위한 부분입니다.

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

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

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

jenna님의 프로필 이미지

작성한 질문수

질문하기