1. GROUP BY & Aggregate 함수
테이블의 레코드를 그룹핑하여 그룹별로 다양한 정보를 계산
테이블에 존재하는 필드 선택하고, 그 값을 기준으로 그룹화
- 그룹핑을 할 필드 결정 ( 하나 이상의 필드 가능)
- GROUP BY 로 지정 (필드 이름을 사용하거나 필드 일련번호 사용)
- 다음 그룹별로 계산할 내용 결정
- Aggregate 함수 사용: count, sum, avg, min, max 등..
ex. 월별 세션수를 계산하는 SQL
monsession_count
| 2019-05 | 6261 |
| 2019-06 | 10520 |
| 2019-07 | 14840 |
| 2019-08 | 17151 |
| 2019-09 | 15790 |
| 2019-10 | 18899 |
| 2019-11 | 18059 |
ex1. 가장 많이 사용된 채널은 무엇인가?
'가장 많이 사용되었다'의 기준은? 사용자 기반 vs 세션 기반
면접이라면 이 기준 먼저 정해야 함.
필요한 정보 - 채널 정보, 사용자 정보 혹은 세션 정보
필요한 테이블 - user_session_channel, session_timestamp 또는 두 테이블 join
channelsession_countuser_count
| Youtube | 17091 | 889 |
| 16982 | 893 | |
| Naver | 16921 | 882 |
| Organic | 16904 | 895 |
| 16831 | 895 | |
| 16791 | 889 |
ex2. 가장 많은 세션을 만들어낸 사용자 ID는 무엇인가?
필요한 정보 - 세션 정보, 사용자 정보
user_session_channel 테이블 컬럼 확인
userid - sessionid - channel
| 184 | c41dd99a69df04044aa4e33ece9c9249 | Naver |
| 251 | 0a54b19a13b6712dc04d1b49215423d8 | |
| 744 | 05ae14d7ae387b93370d142d82220f1b | |
| 265 | 4c4ea5258ef3fb3fb1fc48fee9b4408c | Naver |
userId 별로 묶고 몇 개의 세션Id 기록이 있는지 count
userid - count
| 1615 | 528 |
| 989 | 429 |
| 1493 | 396 |
| 1651 | 385 |
ex3. 월별로 유니크한 사용자 수 카운트
MAU(Monthly Active User)에 해당
필요한 정보 - 시간 정보, 사용자 정보
필요한 테이블 - user_session_channel (userid, sessionId, channel), session_timestamp (sessionId, ts)
userId - sessionID - channel - ts 형태로 테이블 JOIN
monthmau
| 2019-11 | 721 |
| 2019-10 | 763 |
| 2019-09 | 639 |
| 2019-08 | 662 |
| 2019-07 | 623 |
| 2019-06 | 459 |
| 2019-05 | 281 |
Distinct 없이 count를 하면 모든 Id를 세기 때문에 세션 수와 같은 결과를 가짐.
유일한 사용자를 카운트하려면 Distinct를 해줘야함
2. CTAS와 CTE
CTAS: SELECT 를 가지고 테이블 생성
간단하게 새로운 테이블을 만드는 방법, 자주 조인하는 테이블들이 있다면 이를 CTAS 사용해서 조인해두면 편리해짐
DE: 외부 데이터를 data warehouse에 저장 -> raw_data 폴더에 테이블 저장
CTAS를 활용해 JOIN된 테이블 데이터 저장. 일회성으로 끝나는 것이 아니라 새로운 테이블에 저장하는 것 (hyuna_session_summary)
3. 항상 확인해야되는 데이터 품질 확인 방법
- 중복된 레코들 체크하기 : 주어진 테이블의 모든 레코드 수 count, 중복 제거한 레코드 수 count 같으면 문제 없
같은 결과 값 가지므로 중복된 레코드 없음
ds라는 임시 테이블 생성 후 SELECT 에서 활용 가능. 위의 코드와 같은 결과를 갖지만 로직의 차이. 재사용할 수 있는 WITH 사용이 더 나음 => CTE
- 최근 데이터 존재 여부 체크하기 (freshness)
MAX(ts): 가장 최근 데이터 업로드 시간을 알려줌
- Primary key uniqueness가 지켜지는지 체크하기
sessionid만 고유 값을 갖기 때문에 PK가 됨. GROUP BY를 통해 같은 값을 갖는 sessionid끼리 묶고,
카운트 했을 때 1이상이면 pk uniqueness가 깨지게 된다.
- 값이 비어있는 컬럼들이 있는지 체크하기
'SQL' 카테고리의 다른 글
| [SQL] BOOLEAN, NULL 값 처리하기|채널별 월별 매출액 테이블 만들기 (0) | 2024.01.02 |
|---|---|
| [SQL]JOIN이란? INNER, LEFT, FULL, CROSS JOIN (1) | 2024.01.02 |
| [SQL] google colab으로 sql 실습하기 (0) | 2024.01.01 |
| [MySQL]MySQL DB 구축하기 - Excel 파일 올리기 (0) | 2023.12.15 |
| [TIL]KEY-VALUE|JSON_OBJECT,EXTRACT|JSON_INSERT,REPLACE (0) | 2023.12.08 |