데이터엔지니어링
[5주차] SQL을 이용한 데이터 분석(3)
heecup
2024. 4. 24. 16:59
🙂 GROUP BY와 AGGREGATE
✔ 테이블의 레코드를 그룹핑하여 그룹별로 다양한 정보를 계산
- 그룹핑을 할 필드를 결정
- GROUP BY로 지정 (필드 이름을 사용하거나 필드 일련번호를 사용)
- 그룹별로 계산할 내용을 결정
- Aggregate 함수 사용
- COUNT, SUM, AVG, MIN, MAX, LISTAGG, ...
🍦 가장 많이 사용된 채널은 무엇인가?
SELECT
channel,
COUNT(1) AS session_count,
COUNT(DISTINCT userId) AS user_count
FROM raw_data.user_session_channel
GROUP BY 1
ORDER BY 2 DESC;
🍦 가장 많은 세션을 만들어낸 사용자 ID는 무엇인가?
SELECT
userId,
COUNT(1) AS count
FROM raw_data.user_session_channel
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1;
🍦 장단점
TO_CHAR(A.ts, 'YYYY-MM') | 셋 다 동일. 리턴 값이 String |
LEFT(A.ts, 7) | |
SUBSTRING(A.ts, 1, 7) | |
DATE_TRUNC('month', A.ts) | 일(dd)에 해당하는 부분이 '01'. 리턴 값이 timestamp |
🙂 CTAS와 CTE
✔ CTAS: SELECT를 가지고 테이블 생성
- 간단하게 새로운 테이블을 만드는 방법
- 자주 조인하는 테이블들이 있다면 이를 CTAS를 사용하여 조인해두면 편리함.
DROP TABLE IF EXISTS adhoc.[my_name]_session_summary;
CREATE TABLE adhoc.[my_name]_session_summary AS
SELECT B.*, A.ts FROM raw_data.session_timestamp A
JOIN raw_data.user_session_channel B ON A.sessionid = B.sessionid;
✔ 데이터 품질 체크
- 중복 데이터
- 최근 데이터의 존재 여부 (freshness)
- Primary key uniqueness 체크
- null 값 체크
🍦 중복된 레코드 체크
SELECT COUNT(1)
FROM adhoc.[my_name]_session_summary;
SELECT COUNT(1)
FROM (
SELECT DISTINCT userId, sessionId, ts, channnel
FROM adhoc.[my_name]_session_summary
);
상단의 두 값을 비교
CTE를 사용해서 중복 제거 후 카운트
With ds AS(
SELECT DISTINCT userId, sessionId, ts, channnel
FROM adhoc.[my_name]_session_summary
)
SELECT COUNT(1)
FROM ds;
🍦 최근 데이터의 존재 여부 체크
SELECT MIN(ts), MAX(ts)
FROM adhoc.[my_name]_session_summary;
🍦 Primary key uniqueness 체크
SELECT sessionId, COUNT(1)
FROM adhoc.[my_name]_session_summary
GROUP BY 1
ORDER BY 2 DESC
LIMIT 1;
🍦 값이 비어있는 컬럼인지 체크
SELECT
COUNT(CASE WHEN sessionId is NULL THEN 1 END) sessionid_null count,
COUNT(CASE WHEN userId is NULL THEN 1 END) userid_null count,
COUNT(CASE WHEN ts is NULL THEN 1 END) ts_null count,
COUNT(CASE WHEN channel is NULL THEN 1 END) channel_null count,
FROM adhoc.[my_name]_session_summary;