해결된 질문
작성
·
10
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
답변 1
0
안녕하세요!
*의 의미를 본질적으로 이해하시면 좋답니다.
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하는 문제에서 많이 나타나게 된답니다.