강의

멘토링

커뮤니티

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

이설아님의 프로필 이미지
이설아

작성한 질문수

초보자를 위한 BigQuery(SQL) 입문

4-5. 시간 데이터 연습 문제 3~5번

4-5. 3번 문제 질

작성

·

7

0

image.png

안녕하세요, 카일스쿨님 강의 너무 잘 듣고 있습니다.

trainer_id 별로 결과값을 보고싶은데 오류가 해결되질 않아서 질문 남깁니다. 서브쿼리로 작성했기 때문에 trainer_id 별로 확인할 수가 없는 걸까요?

답변 2

0

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

설아님 안녕하세요. 현재 쿼리를 살펴보면,

SELECT # A
  trainer_id,
  FORMAT_DATE ('%d/%m/%Y', MIN_date) AS form
FROM (
  SELECT # B
    MIN(catch_date) AS MIN_date
  FROM(
    SELECT # C
       trainer_id, 
       catch_date
    FROM 'basic.trainer_pokemon"
  ORDER BY trainer_id, catch_date ASC)
  GROUP BY
    trainer_id
)
GROUP BY trainer_id

 

이런 형태고, SELECT에 제가 A, B, C 라고 작성했어요.

쿼리문에서는 아래에 있는 쿼리(안쪽에 있는 쿼리)에 있는 컬럼을 바깥쪽 쿼리에서 사용할 수 있어요. 즉, C에 있는 SELECT문에 있는 컬럼을 B에서 사용할 수 있고, B SELECT문에 있는 컬럼을 A에서 사용할 수 있습니다.

 

지금 쿼리는 서브쿼리를 쓴 것이 문제가 아니고, B에서 MIN(catch_date)만 하셔서 trainer_id 컬럼이 없어서 그래요. 근데 그 쿼리문 보면 GROUP BY엔 trainer_id가 있네요. 아마 집계할 때 GROUP BY를 쓴다는 것은 잘 이해하신 것 같은데, SELECT에도 집계 컬럼을 놓치신 것 같아요.

SELECT
  trainer_id,
  MIN(catch_date) AS MIN_date
FROM Table
GROUP BY 
  trainer_id

 

이렇게 쓰면 안쪽의 SELECT에 trainer_id가 있어서 사용할 수 있습니다.

에러 메세지가 Unrecognized name: trainer_id at [13:3]인데 이 에러를 해석하면 trainer_id라는 이름을 인식하지 못했다는 것을 의미합니다. 인식하지 못했으면 SELECT에 있나 확인해보면 됩니다.

 

정리하면

  • 에러 메세지 읽어보기. 인지를 못한다면 SELECT를 안하고 있을 것

  • GROUP BY를 할 때 GROUP BY 뒤에 나오는 집계 기준을 SELECT에도 써줘야 함

  • 안쪽에 있는 쿼리문에 있는 컬럼만 바깥에 있는 쿼리에서 사용할 수 있음

 

이 부분을 이해하시면 더 좋을 것 같아요. 강의하면 이 부분을 자주 물어보는 내용이에요.

 

추가로 ORDER BY는 쿼리의 안쪽보다 바깥쪽(마지막)에 쓰는 것이 더 좋습니다. 안쪽에서 ORDER BY를 해서 정렬해도 바깥에서 정렬이 깨질 수 있거든요. 정렬이란 것은 모든 값을 다 확인해야 하기 때문에 연산 부하가 있는 편입니다. ORDER BY를 지금 안쪽에 쓸 이유가 없으니 바깥에서 쓰시면 됩니다!

0

안녕하세요, 인프런 AI 인턴입니다. 이설아님, 강의를 잘 수강하고 계시다니 감사합니다! 질문하신 SQL 쿼리 오류에 대해 도움을 드리겠습니다.

질문의 쿼리 분석에 따르면, trainer_id를 그룹화하고 최소 날짜 catch_date를 불러오며, 이 최소 날짜를 특정 형식으로 포맷하려는 목적입니다. 그러나 현재 오류 메시지는 서브쿼리나 이전 섹션에서 전혀 trainer_id를 제대로 참조하지 않기 때문에 발생할 수 있습니다.

아래 코드를 예시로 제시하여 문제 해결을 돕겠습니다.

SELECT
  trainer_id,
  FORMAT_DATE("%d/%m/%Y", MIN(DATE(catch_datetime))) as first_date
FROM
  basic.trainer_pokemon
GROUP BY
  trainer_id
ORDER BY
  trainer_id;

큰 문제 없이 실행된다면, trainer_id를 그룹화하고 각 트레이너의 최소 포획 날짜를 형식화하여 볼 수 있습니다. 만약 서브쿼리를 사용한 복잡성이 필요하다면, 반드시 외부 쿼리의 SELECT문과 서브쿼리에서 trainer_id가 동일하게 참조되어야 합니다.

만약 여전히 같은 오류가 발생한다면, 쿼리의 특정 부분을 점검하는 것이 좋습니다:
- trainer_id가 서브쿼리 및 메인 쿼리에서 모두 참조되는지 확인.
- 데이터셋의 컬럼명이 정확히 일치하는지 점검.

유사한 문제 해결 예시를 찾으신다면, 아래의 기존 응답リンク을 확인하실 수 있습니다:

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

이설아님의 프로필 이미지
이설아

작성한 질문수

질문하기