강의

멘토링

커뮤니티

Cộng đồng Hỏi & Đáp của Inflearn

Hình ảnh hồ sơ của uxtopable
uxtopable

câu hỏi đã được viết

Nhập môn BigQuery(SQL) cho người mới bắt đầu

5-6. VẤN ĐỀ LUYỆN TẬP JOIN 1-2 LẦN

JOIN 1번 문제

Viết

·

21

·

Đã chỉnh sửa

1

안녕하세요

JOIN 연습문제 1번에 대해서 질문이 있습니다

SELET

kor_name,

COUNT(tp.id) AS pokemon_cnt 와

SELET

kor_name,

COUNT(p.id) AS pokemon_cnt

  1. 출력되는 행의 개수는 똑같은데 tp.id 를 쓰는 것과 p.id를 쓸 때 해석 차이가 무엇인지,

  2. 연습 문제가 아닌 실무에서 똑같은 상황일 때 p.id를 사용하면 어떤 문제가 발생하는지,

  3. 연습 문제처럼 COUNT로 집계 할 때 보통 어떤 테이블의 id를 COUNT 하는 것이 보편적인지 궁금합니다.

 

SELECT
	kor_name,
	COUNT(tp.id) AS pokemon_cnt
FROM(
	SELECT
		id,
		trainer_id,
		pokemon_id,
		status
	FROM basic.trainer_pokemon
	WHERE
		status IN("Active","Training")
) AS tp
LEFT JOIN basic.pokemon AS p
ON tp.pokemon_id = p.id
GROUP BY
	kor_name
ORDER BY
	2 DESC
sqlbigquery데이터-리터러시

Câu trả lời 2

1

kyleschool님의 프로필 이미지
kyleschool
Người chia sẻ kiến thức

안녕하세요.

tp.id vs p.id 이 부분은 법칙이 있는 것은 아니고 데이터를 보는 목적에 따라 달라집니다.

tp의 id는 trainer_pokemon의 id고, p.id는 pokemon의 id입니다. 즉, 트레이너가 포켓몬을 잡은 수를 알고 싶다면 tp.id를 세는 것이 더 맞을 수 있고, 포켓몬의 수를 알고 싶다면 p.id를 사용하면 됩니다. 두개의 차이를 제대로 이해하면, 어떤 차이가 있는지 이해할 수 있어요.

 

p.id를 COUNT할 때는 포켓몬에 피카츄, 피카츄, 라이츄, 라이츄, 파이리 이렇게 있을 수 있는데 p.id는 포켓몬의 수를 세는 것이고, DISTINCT p.id로 하면 피카츄, 라이츄, 파이리만 남겠죠(더 정확히는 피카츄, 라이츄, 파이리의 id만 남아요). 반면에 tp.id는 트레이너가 잡은 포켓몬을 의미해서 DISTINCT tp.id를 해도 Unique하게 됩니다.

 

그래서 3개의 질문에 대한 답은 "지금 추출하려고 하는 것이 무엇인지 정확히 생각하고 그거에 맞게 사용해야 한다"고, "tp와 p의 id의 차이점을 제대로 이해하는 것이 필요합니다"라고 답변드릴게요. 그래서 보편적으로 뭘 선택한다 이런 관점보단 상황에 따라 다르다라는 관점으로 이해하시면 될 것 같아요.

 

지금 케이스는 tp.id와 p.id를 DISTINCT하지 않고 COUNT를 했고, JOIN 할 때 1:1 매칭을 했기 때문에 동일한 값이 나오는 상황이고 JOIN이 더 복잡해지거나 하면 id를 잘 선정하는 것이 중요합니다. 연습 문제 중에도 id를 잘 선정해야 하는 문제가 있으니 나중에 풀어보면서 익히시면 좋을 것 같아요(몇 번인지는 알려드리면 스포가 되어서 알려드리진 않을게요)

uxtopable님의 프로필 이미지
uxtopable
Người đặt câu hỏi

답변 감사합니다!

1

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

도절래님께서 질문해주신 정보를 바탕으로, SQL 쿼리에서 tp.idp.id를 사용하는 경우의 차이와 실무에서의 활용에 대해 설명드리겠습니다.

1. tp.idp.id의 해석 차이

  • tp.id: 이 경우, trainer_pokemon 테이블에서 잡은 포켓몬의 수를 계산하는 것입니다. 각 이벤트(포켓몬 잡기)에 대한 고유한 식별자를 카운트합니다. 따라서, 특정 트레이너가 포켓몬을 여러 번 잡았다면, 각 이벤트가 개별적으로 카운트됩니다.

  • p.id: 반면에 p.id를 카운트하면, 포켓몬의 고유한 식별자를 기준으로 포획된 적이 있는 포켓몬의 수를 계산하게 됩니다. 이는 포켓몬 종류별로 한번이라도 잡힌 경우를 카운트하는 것이기 때문에, 트레이너가 여러 명의 동일한 포켓몬을 잡아도 중복으로 셀 수 있는 가능성이 줄어듭니다.

2. 실무에서 p.id를 사용하면 발생할 수 있는 문제

실무에서는 데이터의 정확성과 목적에 따라 어떤 id를 사용할지 신중하게 결정해야 합니다. p.id를 사용하면 종종 포획 이벤트의 중복 여부를 정확히 반영하지 못할 수 있습니다. 따라서, 포획 이벤트에 포커스를 맞추고 싶다면 tp.id를 사용하는 것이 더 적절합니다.

3. 보편적인 COUNT 대상

일반적으로, 집계하는 데이터의 의미에 맞춰 적절한 테이블의 ID를 선택합니다. 이벤트나 액션의 횟수를 세는 경우 trainer_pokemon 같은 트랜잭션 테이블의 ID를, 고유 객체의 수를 세는 경우 pokemon 같은 마스터 테이블의 ID를 사용하는 것이 보편적입니다.

도절래님께서 고려하시는 상황에 따라 COUNT할 항목을 신중히 선택하시면, 보다 정확한 데이터를 얻을 수 있을 것입니다. 이와 관련된 추가 정보와 예시는 관련된 게시물에서 JOIN 1번 문제와 같은 유사한 질문을 참고하실 수 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Hình ảnh hồ sơ của uxtopable
uxtopable

câu hỏi đã được viết

Đặt câu hỏi