강의

멘토링

커뮤니티

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

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

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

BigQuery(SQL) ứng dụng nâng cao (phân tích phễu, phân tích retention)

2-11. Bài tập thực hành hàm cửa sổ (bài 1)

윈도우 연습문제 1번 질문

Đã giải quyết

Viết

·

51

0

실행 결과는 동일하게 나왔는데, COUNT를 다르게 쓴 것이 괜찮은지 궁금해서 질문 남깁니다!

상황

  • 같은 날짜에 여러 번 쿼리 실행한 사용자들이 있어서 COUNT(*)을 해야겠다고 판단했습니다. (어차피 Distinct가 없으면 같은 날짜라도 각각 카운트한다는 것을 깜빡했었습니다ㅠ)

  • 카일스쿨님은 COUNT(query_date)를 쓰셨고, 결과만 보면 제 쿼리와 동일하긴 합니다.

궁금한 점

  • 제 쿼리처럼 COUNT(*)을 쓰는 경우에 문제가 될까요?

    혹시 실무적으로 COUNT(*)은 잘 쓰지 않는지 궁금합니다!

    • (Ex. 어떤 컬럼의 개수를 세는 것인지 가독성이 좋지 않다든가..)

  • 제 쿼리는 아래와 같습니다.

     

SELECT
  *,
  COUNT(*) OVER(PARTITION BY user) AS total_query_cnt
FROM advanced.query_logs
ORDER BY query_date, user

 

sqlGoogle-Analyticsfirebasegoogle-sheetsbigquery카카오공채-서비스

Câu trả lời 1

0

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

안녕하세요!

 

*의 의미를 본질적으로 이해하시면 좋답니다.

COUNT(*) : 모든 Row의 수를 COUNT한다는 의미입니다

COUNT(query_date) : query_date에 있는 값의 수를 COUNT한다는 의미입니다.

두개의 차이는 NULL을 포함하는지?입니다

COUNT(*)은 Row의 수를 세기 때문에 NULL도 포함해서 COUNT를 하고, COUNT(query_date)는 query_date에서 NULL이 아닌 행만 셉니다.

지금 데이터에서는 값에 NULL이 없기 때문에 동일하게 나오는거라 보면 됩니다. 데이터가 어떻게 저장되어 있는지를 잘 파악해야 *을 사용할지, 컬럼을 명시할지가 결정됩니다.

 

그리고 query_date를 사용한 이유는 query_date가 있는 경우를 세고 싶었기 때문이에요. 물론 지금 데이터는 *을 사용해도 괜찮구요. id 같은 값이 있었다면 id를 COUNT할텐데 id가 없는 데이터라 query_date를 COUNT했다고 생각해주시면 되어요

 

즉, 목적에 따라 다르다입니다. 실무에서 뭘 쓰냐는 결국에 목적에 따라 다릅니다. 내가 어떤 데이터를 보려고 하는지? 그래서 초보자를 위한 BigQuery 입문에서 쿼리를 작성할 때 어떤 것을 구하려고 하는지를 써보라고 템플릿을 드린 거예요. 이게 명시적으로 정리가 되어야 쿼리를 짤 때 판단을 할 수 있어요!

 

추가로 활용편의 데이터는 단일 테이블이고 NULL이 거의 없습니다. 그래서 강의를 들을 때는 두개 모두 다 상관없이 사용하셔도 됩니다.

실무에서 이슈가 되는 경우는 여러 테이블을 JOIN하면서 특정 컬럼에 NULL이 생길 수 있어요. 이럴 때는 데이터의 Row가 늘어난 것처럼 보일 수 있거든요. 이런 경우 *을 쓰면 Row 수만 세서 좀 많아집니다. 그래서 저는 명시적으로 컬럼을 쓰곤 해요. 이번 초보자를 위한 BigQuery 입문의 연습 문제에서 JOIN하고 COUNT하는 문제에서 많이 나타나게 된답니다. 

 

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

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

Đặt câu hỏi