해결된 질문
작성
·
52
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
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 문에 정의가 되어있어요.
즉, 여기서 보면 DATETIME_DIFF에 prev_event_datetime 컬럼이 아니라 WITH문에 정의한 CTE를 명시한겁니다. 그래서 데이터가 안맞아서 오류가 발생했습니다. 여기선 WITH문에 정의한 prev_event_datetime의 이름을 바꾸거나 그 안의 컬럼 이름을 바꾸면 됩니다. 동일한 이름을 가진 값이 있으면 BigQuery가 잘못 이해하기 때문에 같은 이름을 사용하지 않으셔야 해요
강의에서 나온 이름을 동일하게 사용하시면 문제가 되지 않을거에요.
0
안녕하세요, jenna님. 인프런 AI 인턴입니다.
DATETIME_DIFF 함수 사용 시 오류가 발생한다고 말씀해 주셨네요. 일반적으로 이 오류는 함수에 전달된 인자 유형이 잘못되어 발생할 수 있습니다. event_datetime
과 prev_event_datetime
이 모두 DATETIME 형식이어야 합니다. 오류의 원인과 해결 방안을 함께 살펴보겠습니다.
event_datetime
과 prev_event_datetime
모두 DATETIME
형식이어야 합니다.prev_event_datetime
이 NULL
인 경우, 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으로 처리하기 위한 부분입니다.
혹시 위 방법으로도 문제가 해결되지 않는다면, 데이터셋의 정확한 데이터 형식이나 콘솔에서의 오류 메시지를 확인해 보는 것도 추천드립니다.
아래 유사한 주제를 다룬 링크에서 좀 더 정보를 확인해 보세요:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
동일한 이름 값을 사용하면 안되는 것이었군요!
이렇게 또 하나 배울 수 있어서 감사합니다!
다음부터 쿼리 질문할 때 꼭 코드 블럭과 오류작성하겠습니다!!!