윈도우 연습문제 1번 질문
실행 결과는 동일하게 나왔는데, 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
Answer 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하는 문제에서 많이 나타나게 된답니다.
최종 과제 제출
0
79
3
BigQuery 활용편 18강 질문있습니다!
0
80
1
리텐션 공부하다가 궁금한게 생겨 질문드립니다
0
79
2
안녕하세요 강사님 코호트 쿼리 공부하다가 의문점이 생겨서 문의드립니다
0
70
2
biquery 테이블 생성 오류 이슈
0
51
2
동일하게 쿼리를 작성했는데 화면과 다른 값이 나옵니다
0
72
2
[과제] 퍼널 PIVOT 테이블 작성하기
0
64
2
array 등
0
61
2
N day 리텐션 쿼리 관련 질문
0
61
2
이동평균 계산 시 order by 기본값은 뭔가요?
0
66
2
user_id에 NULL이 나오는데 정상인가요?
0
70
2
3-13 리텐션 과제 제출
0
92
2
최종 과제 제출
0
129
3
weekly retention 구하기 과제
0
90
2
1-9. 피벗 쿼리 작성
0
78
2
app_logs 테이블 생성 문제
0
70
2
Weekly Retention 구하기 완성하였습니다.
0
75
2
[과제] 퍼널 쿼리(피벗테이블 적용) 작성 완료
0
104
2
3-7 Weekly, Monthly Retention 쿼리 작성
0
91
2
정성 데이터 분석 방법 문의
0
163
1
최종 과제 제출
0
105
3
1-6 예시 문제 풀이
0
66
2
최종과제 제출
0
141
2
3-13. 리텐션 과제
0
201
3

