본문 바로가기
C.W.K.
Stream
Lesson 13 of 16 · published

GROUP BY와 집계 함수

~14 min · queries, aggregation

Level 0스키마 새싹
0 XP0/86 lessons0/10 achievements
0/120 XP to next level120 XP to go0% complete

여러 행을 한 요약으로 접어

GROUP BY는 같은 키의 행을 묶고 COUNT, SUM, AVG, MIN, MAX가 묶음마다 한 값을 계산하게 해. 전체 합계 1개가 필요한지, 고객별·날짜별 합계가 필요한지 결과의 단위를 먼저 정해.

선택한 일반 열은 그룹의 의미와 맞아야 해

집계하지 않은 열은 GROUP BY에 들어가거나 그룹 키에 의해 하나로 결정되어야 해. PostgreSQL은 기본 키의 함수 종속성을 알아 SELECT u.email, COUNT(*) FROM users u GROUP BY u.id 같은 질의를 허용할 수 있어. 그래도 독자가 결과 단위를 바로 이해하도록 쓰는 게 중요해.

시간을 원하는 단위로 묶어

DATE_TRUNC('day', timestamp_col)로 일 단위를 만들고, 필요하면 월·분기 단위로 바꿔. 문자열 열을 억지로 MIN(email)이나 MAX(email)로 통과시키지 마. 시간 범위를 좁힐 수 있다면 WHERE로 먼저 줄여. PostgreSQL은 그룹화 규칙을 엄격히 검사해. MySQL의 느슨한 그룹화 설정처럼 그룹마다 임의의 값을 고르는 동작과는 달라.

Code

테이블 전체 요약·sql
SELECT COUNT(*)         AS total_orders,
       SUM(total)       AS revenue,
       AVG(total)       AS avg_order,
       MIN(total)       AS smallest,
       MAX(total)       AS largest,
       COUNT(DISTINCT customer_id) AS unique_customers
FROM   orders;
그룹별 집계·sql
SELECT u.name,
       COUNT(o.id)         AS order_count,
       SUM(o.total)        AS total_spent,
       ROUND(AVG(o.total), 2) AS avg_order
FROM   users u
JOIN   orders o ON o.user_id = u.id
GROUP  BY u.name
ORDER  BY total_spent DESC;
DATE_TRUNC로 시간 구간 나누기·sql
SELECT DATE_TRUNC('month', placed_at) AS month,
       COUNT(*)                       AS orders,
       SUM(total)                     AS revenue
FROM   orders
GROUP  BY DATE_TRUNC('month', placed_at)
ORDER  BY month;

-- 트래픽 분석 위한 시간대별
SELECT EXTRACT(HOUR FROM placed_at) AS hour_of_day,
       COUNT(*) AS orders
FROM   orders
GROUP  BY 1
ORDER  BY 1;

External links

Exercise

지난 1년의 월별 활성 사용자 수를 중복 없이 세는 질의를 만들어. 이어서 이 트랙의 15번 수업에서 다룰 self-join이나 윈도 함수를 사용해 각 달의 값 옆에 전월 값을 표시해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.