데이터 분석가:Applied Data Analytics/SQL

그룹 함수

데이터분석 2025. 1. 13. 15:02

그룹 함수란?

다양한 차원에서 데이터를 분석할 수 있는 함수. 데이터를 통계 내기 위한 소계, 중계를 구하는 함수이다.

SELECT col1, col2, aggregate_function(argument)
       FROM table
       GROUP BY GROUP_FUNCTION(col1, col2)

 

구조설명

ROLLUP 소그룹 간 소계 계산
CUBE 다차원적 소계 계산
GROUPING SETS 특정 항목의 소계 계산

ROLLUP, CUBE, GROUPING SETS

 

 

CREATE OR REPLACE TABLE `dev-aileron-447402-k9.modulabs.employees` (
   name STRING,
   department STRING,
   job STRING,
   salary INT64
);

-- 임시 테이블에 데이터 삽입
INSERT INTO `dev-aileron-447402-k9.modulabs.employees` (name, department, job, salary)
VALUES
 ('Amy', 'Sales', 'Manager', 80000),
 ('Bob', 'Sales', 'Sales Rep', 50000),
 ('Charlie', 'Sales', 'Sales Rep', 55000),
 ('David', 'HR', 'Manager', 75000),
 ('Eve', 'HR', 'Recruiter', 60000),
 ('Frank', 'HR', 'Recruiter', 65000),
 ('Grace', 'IT', 'Manager', 90000),
 ('Hank', 'IT', 'Developer', 70000),
 ('Ivy', 'IT', 'Developer', 75000);

 

SELECT department, job, SUM(salary)
FROM modulabs.employees
GROUP BY department, job;

 

-- 부서(department), 직무(job)별 salary 소계: ROLLUP
SELECT department, job, SUM(salary)
FROM modulabs.employees
GROUP BY ROLLUP(department, job);

 

-- 부서(department), 직무(job)별 salary 소계: CUBE
SELECT department, job, SUM(salary)
FROM modulabs.employees
GROUP BY CUBE(department, job);

 

-- 부서(department), 직무(job)별 다양한 소계: GROUPING SETS
SELECT department, job, SUM(salary)
FROM modulabs.employees
GROUP BY GROUPING SETS((department, job), (department), ());  -- ()총계

 

로그 데이터란? 

JSON 구조의 로그 데이터

웹 페이지, 어플리케이션, 응용 프로그램 등에서 수집된 동작 및 활동 정보

 

CREATE OR REPLACE TABLE dev-aileron-447402-k9.modulabs.user_logs (
 log STRING,
 user_id STRING,
 action_detail STRING
);


-- 임시 테이블에 데이터 삽입
INSERT INTO dev-aileron-447402-k9.modulabs.user_logs (log, user_id, action_detail)
VALUES
 ('{"user": "user1", "action": "login", "timestamp": "2023-11-01T08:00:00"}', '1001', 'button_click'),
 ('{"user": "user2", "action": "logout", "timestamp": "2023-11-01T09:30:00"}', '1002', 'button_click'),
 ('{"user": "user1", "action": "purchase", "timestamp": "2023-11-01T10:15:00"}', '1001', 'button_click');

 

-- JSON_EXTRACT로 dictionary형 데이터 쪼개기
SELECT *,
 JSON_EXTRACT(log, '$.user') AS user,
 JSON_EXTRACT(log, '$.action') AS action,
 JSON_EXTRACT(log, '$.timestamp') AS timestamp
FROM modulabs.user_logs;