💡Today I Learned
- 데이터 웨어하우스와 SQL, 데이터분석에 대한 두 번째 수업을 진행했습니다.
- Redshift, SQL에 대한 개념과 SQL 문법을 이용한 Redshift에서의 쿼리 실습
1. Redshift 론치 데모
- Launch하고자 하는 지역 확인 → 'Seoul'에 있는 AWS region에서 Redshift launch
- 외부에서 (실습_코랩 환경)에서 Redshift로 접근 가능하게 해야함 (원래 보안 설정 = 같은 aws 네트워크 안에 있는 서버에서만 접근 가능함)
2. 웹 서비스 사용자/세션 정보
- 사용자 ID: 보통 웹서비스에서는 등록된 사용자마다 부여하는 유일한 ID
- 세션 ID: 세션마다 부여되는 ID (세선 = 사용자의 방문을 논리적인 단위로 나눈 것)
→ 하나의 사용자는 여러 개의 세션을 가질 수 있음
→ 세션이 생긴 시간 기록
→ 일반적으로 세션을 만들어낸 접점(경유지) = '채널' (혹은 터치포인트) 이라는 이름으로 기록해둠 (ex: 어느 채널에서 가장 많이 매출로 이어졌는지, 마케팅 관련 기여도 분석 가능)
- 마케팅 관련, 사용자 트래픽 관련 정보
- DAU, WAU, MAU ... 일/주/월 별 AU(Active User) 차트 (SQL로 count 가능)
- 마케팅 채널 기여도 분석 (어느 채널에 광고를 하는 것이 가장 효과적일까?, 우리에게 가장 많은 매출을 만들어 준 채널?)
- raw_data db 스키마 = user_session_channel 테이블 + session_timestamp 테이블
- sessionid가 primary_key
3. SQL (Redshift 중심의 DDL, DML 소개)
- 다중 sql 문 사용 시 세미콜론(;)으로 분리
- -- 한 줄 주석
- /*--*/ 여러 줄 주석
- DDL
CREATE TABLE raw_data.user_session_channel {
userid int,
sessionid varchar(32) primary key,
channel varchar(32)
};
: 아직 뼈대만 만든 상태 (저장된 레코드는 아직 없어서 insert into, copy 등으로 추가해줘야 함)
DROP TABLE table_name;
DROP TABLE IF EXISTS table_name; -- 해당 테이블이 존재할 때만 (에러 발생 x)
ALTER TABLE [테이블 이름] ADD COLUMN [필드 이름] [필드 타입]
ALTER TABLE [테이블 이름] RENAME [현재 필드 이름] to [새 필드 이름]
ALTER TABLE [테이블 이름] DROP COLUMN [필드 이름]
ALTER TABLE [테이블 이름] RENAME to [새 테이블 이름]
- DML
INSERT INTO -- 내용 추가
UPDATE FROM -- 내용 수정
DELETE FROM -- 내용 삭제 (* 레코드를 다 지워도 테이블의 구조, 스키마는 여전히 존재함), 트랜잭션에 사용 가능
TRUNCATE -- 모든 레코드 삭제, but 트랜잭션에는 사용 불가
COPY -- 벌크 업데이트 (추가)
: 'INSERT INTO'는 시간 오래 걸림
: 따라서 'COPY' (벌크 업데이트) 명령어로 레코드들을 csv, json 등의 파일에 저장 → AWS의 S3(스토리지)에 업로드 → S3에서 원하는 테이블로 벌크 업데이트 (한꺼번에)
SELECT
FROM
WHERE
GROUP BY -- DAU, WAU, MAU
HAVING -- 그룹에 대한 조건
ORDER BY
LIMIT N; -- 상/하위 N개만
4. SQL을 이용한 데이터 분석
: 현업에서는 깨끗한 데이터란 존재하지 않음
: 데이터의 품질을 항상 의심하고 체크하는 버릇 (중복 레코드, 최근 데이터의 존재 여부, 기본키의 유일성이 지켜지는지, null인 필드들이 있는지 .. ) → 코드를 짜서 unit test 형태로 만들어 매번 쉽게 체크 (자동화)
- 테이블이 점점 늘어나감에 따라 Data Discovery 문제들이 생겨남
: 중요한 테이블 & 메타 정보 에 대한 이해/관리가 중요해짐
: 무슨 테이블에 원하는 & 신뢰할 수 있는 정보가 들어있는지?
: 테이블에 관한 질문을 누구에게?
→ 다양한 오픈소스 서비스 출현 (DataHub(Linkedin), Amundsen(Lyft), Select Star, DataFrame, etc ...)
5. SELECT
: 테이블에서 레코드를 읽어오는 데 사용
: 조건 → WHERE 절 사용
: SELECT의 결과 = 마찬가지로 테이블!
SELECT DISTINCT channel -- 유일한 채널 필드 이름
FROM [테이블 이름]
SELECT channel, COUNT(1) -- 채널별 카운트
FROM [테이블 이름]
GROUP BY 1;
SELECT CASE
WHEN [조건1] THEN [값1]
WHEN [조건2] THEN [값2]
ELSE [값3]
END [필드 이름[
6. NULL
: '값이 존재하지 않음'을 나타내는 상수
: 필드 지정 시 값이 없을 경우 NULL로 지정 가능
: 사칙연산 사용 후에도 결과는 NULL
WHERE [필드 이름] is NULL
WHERE [필드 이름] is not NULL
7. COUNT, WHERE, STRING, ORDER BY
SELECT COUNT(1) FROM count_test -- 7 (주어진 테이블의 전체 레코드의 개수 반환함)
SELECT COUNT(0) FROM count_test -- 7
SELECT COUNT(NULL) FROM count_test -- 0 (주어진 인자의 값이 NULL이면 0이 됨, not NULL이 인자면 1씩 더해감)
SELECT COUNT(value) FROM count_test -- 6 (NULL이 아닌 것들만 +1씩)
SELECT COUNT(DISTINCT value) FROM count_test -- 4 (distinct한 값 5개 중 NULL 제외 4개만 카운트)
: 주어진 인자의 값이 NULL이면 0, not NULL이면 레코드 개수만큼 1씩 더해감
- WHERE
WHERE channel IN ('Google', 'Youtube')
WHERE channel NOT IN ('Google', 'Youtube')
WHERE channel LIKE 'G%' -- 'G*', 대소문자 구분 o
WHERE channel ILIKE '%o%' -- '*o*', 대소문자 구분 x
WHERE channel NOT LIKE 'G%'
WHERE channel NOT ILIKE '%o%'
BETWEEN
- STRING 함수
: LEFT(str, N) = 왼쪽부터 N개
: REPLACE(str, exp1, exp2) = str에서 exp1를 exp2로 변경
: UPPER(str)
: LOWER(str)
: LEN(str)
: LPAD, RPAD = 왼/오른쪽 패딩
: SUBSTRING = 부분 문자열
- ORDER BY
: ASC, DESC로 오름/내림차순 정렬
: NULL은 ASC면 마지막에, DESC면 처음에 위치함
8. 날짜 관련 함수
CONVERT_TIMEZONE('America/Los_Angeles', ts) = 타임존 변환
GETDATE() = 현재 시간 반환
TRUNCATE
DATE_TRUNC
EXTRACT
DATE_PART = 날짜시간에서 특정 부분의 값 추출 가능
DATEDIFF = 두 날짜 사이 일수 계산
DATEADD
GET_CURRENT
9. Type Casting
1) :: 오퍼레이터 사용 (category::float)
2) cast 함수 사용 ( cast(category as float) )
💡Furthermore
- SQL day_2 퀴즈 풀이
- AWS Redshift 클러스터 생성 (클러스터 서브넷이 없다...?) 문제 해결 & 코랩 실습 (Redshift에 연결 불가 ㅠㅠ)
'데브코스 > TIL' 카테고리의 다른 글
[TIL] 6주차_Day24: 데이터 웨어하우스와 SQL과 데이터분석 (4) (1) | 2023.11.20 |
---|---|
[TIL] 6주차_Day23: 데이터 웨어하우스와 SQL과 데이터분석 (3) (2) | 2023.11.19 |
[TIL] 6주차_Day21: 데이터 웨어하우스와 SQL과 데이터분석 (1) (1) | 2023.11.13 |
[TIL] 5주차_Day20: 크롤한 웹데이터로 만들어보는 웹사이트 (5) (0) | 2023.11.10 |
[TIL] 5주차_Day19: 크롤한 웹데이터로 만들어보는 웹사이트 (4) (0) | 2023.11.09 |