Google BigQuery

[강의 수강 3일차] 집계(Group by, having, sum/count)

쭈경잉 2025. 5. 8. 08:05

데이터를 활용하는 과정에 있어 데이터를 탐색하는 과정에서도 "요약" 과정에

해당하는 집계 관련된 부분을 배우는 시간 [group by, having, sum/count 이해하기] 

 

 

데이터를 활용하는 과정을 설명해주는 것이 공감되었는 데,

무엇이든 "어떤 일을 해야 한다" > "원하는 것을 정한다" so what & why so 를 묻고 답하는 과정은 필수인 듯 하다.

 

요약하는 과정에서 집계라는 과정이 필요하고

모아서(그룹화) 계산하는 것이 집계로 생각하면 된다.

 

✏️ 여기서 핵심은 그룹화! ➡️ Group by 로 같은 값끼리 모아서 그룹화하여 집계하는 것이 핵심 

 

✅ 계산은 더하기, 빼기, 최대값, 최소값, 평균, 갯수 세기가 있다.

 

특정 컬럼을 기준으로 모으면서 다른 컬럼에서는 집계 가능하다.

ex. 고객별 ID 값에서 같은 주문인 경우 주문금액을 합계 내리는 방식 = 인당 총 주문금액 확인 가능

 

여기서 추출을 할 때 "정렬(order by)"를 이용해 총 주문 금액이 큰 것부터 나열할 수 있음 

> 이런 경우, 충성고객 등을 정의할 때 유용하게 활용할 수 있을 것으로 예상됨 

 

이때 포인트는 어떤 것을 "조건"으로 설정할 지가 중요하다. (문제 파악 후 그룹핑하는 것이 핵심) 

SELECT
	집계할_컬럼1
    집계 함수(count, max, min 등)
FROM Table
GROUP BY 
	집계할_컬럼1

 

✏️ 집계할 컬럼을 SELECT 에 명시하고 그 컬럼을 꼭 GROUP BY에 작성해야 한다. (*명시하기 위함) 

 

bigquery 안내 문서를 참고하면 집계 함수의 리스트를 확인할 수 있으니 체크해보기

➡️ 필요할 때 서칭 & 공식 문서를 잘 활용하는 것도 이후 독학할 때 중요 키 포인트일 것 같다. 

 

Distinct : 고유값을 알고 싶은 경우

별개의 여러 값 중에 Unique 한 것만 보고 싶은 경우 사용하며 중복을 제거한 것이다.

예를 들어 기간 내의 총 주문 고객 수를 알고 싶을 때 distinct 를 활용하면 된다.

보통 count와 쓰는 경우가 많다고 한다! 

 

ex. 메인 페이지 view 수 vs 메인 페이지 view한 유저수 => 다를 것 / 보조 지표로 함께 활용하는 편이 좋다.

➡️ count(user_id) vs count(DISTINCT user_id) 값이 다름을 보조적으로 확인하기! 

SELECT
	집계할 컬럼,
    COUNT(DISTINCT count할 컬럼)
FROM table
GROUP BY 
	집계할 컬럼

 

집계 연습 문제
--1. pokemon 테이블에 있는 포켓몬 수를 구하는 쿼리 작성해주세요
--사용할 테이블 : pokemon
--조건 : x
--집계할 때 사용할 컬럼 : x
--집계할 때 사용할 계산 : 수를 구한다 => count, 포켓몬
SELECT
	COUNT(id) as cnt
FROM basic.pokemon

--2. 포켓몬의 수가 세대별로 얼마나 있는 지 알 수 있는 쿼리를 작성해주세요
--사용할 테이블 : pokemon
--조건 : x
--그룹화 할 때 사용할 컬럼 : generation
--집계할 때 사용할 계산 : count
SELECT
	generation,
    COUNT(id) AS cnt
FROM basic.pokemon
GROUP BY 
	generation

 

TIP 그룹화(집계) 활용 포인트

데이터 분석하다 그룹화가 필요한 경우,

일자별 집계(원본 데이터의 경우 특정 시간에 어떤 유저가 한 행동이 기록, 일자별로 집계할 경우) 

연령대별 집계(특정 연령대에서 더 많이 구매했는가?) 

특정 타입별 집계(특정 제품 타입을 많이 구매했는가?)

앱 화면별 집계(어떤 화면에 유저가 많이 접근했는가?)

✏️ 결국 여기서도 "질문"을 잘 던지는 것이 분석 및 추출하는 데 도움을 준다는 점을 알 수 있었다. 

 

조건을 설정하고 싶은 경우 : WHERE
table에서 바로 조건을 설정하고 싶은 경우

 

조건을 설정하고 싶은 경우: HAVING 
테이블에 없던 컬럼을 생성 후 해당 컬럼을 조건으로 활용하는 경우 

✏️ having의 경우, 새롭게 생긴 컬럼에 조건을 준다고 생각하면 된다.

쿼리 내에 다른 쿼리가 들어갈 경우, having 써서 간결하게 만들 수 있다. 

 

WHERE 은 원본 데이터 / HAVING + GROUP BY와 함께 활용한 조건으로 이해하면 편하다

집계 후 having의 조건으로 활용되는 로직으로 이해하면 된다.
"바로" / group by 결과 기반으로의 차이!

서브쿼리

- SELECT 문에 존재하는 SELECT 쿼리

- FROM 절에 또 다른 SELECT 문을 넣어 테이블 처럼 활용하는 방법

- 괄호로 묶어서 사용

 

서브쿼리를 작성하고 서브 쿼리 바깥에서 WHERE 조건 설정하는 것 = 서브 쿼리에서 HAVING 으로 하는 것 

 

정렬하기 : ORDEY BY 
SELECT 
	col
FROM 
ORDER BY <컬럼> <순서>

 

순서 : DESC(내림차순), OSC(오름차순 - 보통 default 로 설정되어 있다)

ORDER BY 는 쿼리의 맨 마지막(아래)에 두고, 쿼리의 맨 마지막에만 작성하면 된다

✏️ 중간에 필요없고 중간에 작성 시 불필요한 로직이 발생될 수 있으니 마지막에 써주기

 

출력 개수 제한하기 : LIMIT

 

쿼리문의 결과 ROW 를 제한하고 싶은 경우 LIMIT 사용

✏️ 쿼리문의 제일 마지막에 작성해야 한다.

 

모든 결과와 조건이 반영된 후의 결과 값에서 제한해서 추출하는 것이기 때문! (*ORDER BY 함께 쓸 경우 그 다음으로 써주면 된다)

 

GROUP BY 연습 문제
--3. 포켓몬의 수를 타입별로 집계하고 포켓몬 수가 10이상인 타입만 남기는 쿼리를 작성해주세요. 포켓몬 수 많은 순 정렬
--테이블 : pokemon
--조건(where) 테이블 원본 -> 없음
--집계 후 조건(having) -> 10이상
--정렬 -> 포켓몬 수가 많은 순 정렬(order by 포켓몬 수 desc) 
-- having 하기 전 단계적으로 실행해보며 가도 된다!

 SELECT
	type1,
    COUNT(id) as cnt
FROM basic.pokemon
GROUP BY
	type1
HAVING cnt >= 10
ORDER BY cnt DESC

 

✅ SQL이 처리되는 로직 / 문제에 따라서 단계별로 조건과 추출 데이터에 대한 정보 흐름을 적어주면

사고의 흐름과 추출 과정을 볼 수 있어서 좋은 것 같다. 

 

✏️ 이번 강의와 학습을 통해 느낀점
✅ 집계함수를 이해하고 내가 원하는 데이터 추출하는 과정을 데이터 선택 > 조건 선택 > 보고자 하는 데이터 정렬 기준 편하게 보기 순서로 확인해보는 연습이 중요한 것 같다. 

 

💪🏻 Next to do 

☑️ 고객 데이터 기반 집계를 통해 고객 LTV 관련 데이터 확인하는 쿼리 작성해보기 

☑️ 집계를 통해 간단 추출하기 & 연습 문제를 통해 select절 익숙해지기