[GA활용] 전환율 구하기 기본
·
DB/SQL
전환율 : "A를 하고나서 B를 한 경우"- 물론 시간과 행동, 행위자가 규정되어있어야 할 것이다 어렵게 생각하지 말자컴퓨팅의 기초는 노가다라는 것을 잊지말고 단계를 쪼개서 한개씩 한다고 생각해야 한다A를 하고 B를 하기 때문에우선은 A를 먼저 구한다 (With first table)그리고 B를 구한다 (With Second table)그리고 이걸 연결할 방법을 찾는다 (JOIN ON Condition)WITH pv AS (SELECT user_pseudo_id, ga_session_id, event_timestamp_kst AS pv_atFROM ga WHERE 1=1AND event_name = 'page_view'), -- 1. 페이지를 본 세션scroll AS ( SELECT user..
[Concat] 문자열 다중 조합
·
DB/SQL
MySQL에서는 되는 신기한 문법SELECT COUNT(DISTINCT user_pseudo_id,ga_session_id) AS pvFROM gaWHERE event_name = 'page_view' - 이렇게 COUNT(DISTINCT()) 안에 넣어주게 되면 user_pseudo_id와 ga_session_id를 문자열로 합쳐서 하나의 고유한 값으로 변환 후, COUNT(DISTINCT ...) 적용 다른 SQL에서는-- SQLSELECT COUNT(DISTINCT CONCAT(user_pseudo_id, '-', ga_session_id)) AS pv -- page viewFROM gaWHERE event_name = 'page_view';-- BigquerySELECT COUNT(DIST..
[Aggregation] 일간/주간 집계
·
DB/SQL
Retension 공부를 하다보니 일간 활성화 User와 주간 활성화 User를 구하는 방법에 대해서 공부를 했다그리고 Stickiness를 구하는 것 까지가 문제였다Stickiness(고객 고착도) : $ Stickiness = \frac{DAU}{WAU}$첫 시도는 일간 사용자를 구한 뒤 해당 날 1주일 전까지의 누적합을 구하는 방식으로 갔다분명 일간과 주간의 활성화 User를 구하는 것은 무난하게 접근했으나 고객 고착도를 구하는 과정에서그 이전날짜까지 구해지게 되어 멸망하고 말았다 조금 더 간단한 방법의 풀이를 해설을 통해 알게 되었는데 누적합을 구하는 Correlation Subquery 대신Self-Join을 쓰는 방법으로 풀이할 수 있었다풀이는 생각보다 간단했다아마 접근방법은 유사했지만 무언가..
[Cohort-Pivot] 2개월 차에도 구매한 고객 찾기
·
DB/SQL
역시 SQL은 단도직입적으로 들어가는 것이 좋다예시첫 주문 월첫 주문 월의 구매 고객 수2개월차 주문 월 구매 고객수2020-012020-01 의 구매 고객 수2020-02 의 구매 고객 수2020-022020-02 의 구매 고객 수2020-03 의 구매 고객 수 - 첫 주문월이 GROUP BY의 조건이 될 것인데  그렇다는 것은 첫 주문월의 구매 고객수는 첫 주문월과 같은 Row, 2개월차는 첫 주문월의 다음달과 같은 Row를 세면 되는 것 그렇다는 것은 아래와 같이 만들 수 있다주문 월주문 월 + 0주문 월 + 12020-012020-01 의 구매 고객 수2020-01 + 1개월의 구매 고객 수 2020-022020-02 의 구매 고객 수2020-02 + 1개월의 구매 고객 수 즉 첫 주문 월(주문 ..
[SubQuery] 다양한 서브쿼리
·
DB/SQL
🎯 서브쿼리(Subquery)란?서브쿼리(Subquery)는 SQL 쿼리 안에 포함된 또 다른 쿼리를 의미함- 일반적으로 SELECT, INSERT, UPDATE, DELETE 문 안에서 조건을 필터링하거나, 계산된 값을 반환하기 위해 사용- 서브쿼리는 크게 단일행 서브쿼리, 다중행 서브쿼리, 다중컬럼 서브쿼리로 나뉩니다.1️⃣ 단일행 서브쿼리 (Scalar Subquery)✔️ 정의단일 값(하나의 행, 하나의 컬럼)만 반환하는 서브쿼리.반환된 값은 비교 연산자(=, , =, )를 사용해 단일 값과 비교하는 데 사용됩니다.SELECT COL1, COL2FROM TABLEWHERE COL3 = (SELECT AGG_COL FROM TABLE WHERE CONDITION);1️⃣ 다중행 서브쿼리 (Mult..
[심화] Correlated Subquery
·
DB/SQL
Correlated Subquery는 SQL에서 사용되는 서브쿼리의 한 종류로, 내부 서브쿼리가 외부 쿼리의 컬럼 값을 참조하는 경우로 자기 참조가 핵심 이동평균 / 누적합 이동평균 구하기- 구조 (전/후 1일 기준)SELECT 시간컬럼 , 값컬럼 , ( SELECT AVG(값컬럼) FROM 테이블 t2 WHERE 1=1 AND 기간컬럼 BETWEEN DATE_SUB(t1.기간컬럼, INTERVAL 1 DAY) AND DATE_ADD(t1.기간컬럼, INTERVAL 1 DAY) )FROM 테이블 t1 누적합 구하기- 구조 SELECT 시간컬럼 , 값컬럼 , (SELECT SUM(값컬럼) FROM 테이블 t2 WHERE t2.시간컬럼 ..
[Window] 윈도우 함수
·
DB/SQL
🎯 윈도우 함수(Window Functions)란?- 윈도우 함수는 쿼리 결과 집합의 각 행에 대해 계산을 수행하는 SQL 함수- 일반적인 집계 함수(SUM, AVG, COUNT)와는 달리, 그룹화하지 않고도 집계 결과를 행별로 반환할 수 있음- 즉, 데이터를 그룹화하지 않고도 집계 및 분석이 가능하다는 점이 큰 특징입니다. 함수() OVER ()함수() OVER (PARTITION BY 컬럼)함수() OVER (ORDER BY 컬럼)함수() OVER (PARTITION BY 컬럼 ORDER BY 컬럼) -- 둘 다 사용할 때는 PARTITION BY가 앞에 나와야 합니다.SELECT 컬럼명, 윈도우_함수(컬럼명) OVER ( PARTITION BY 분할_컬럼 OR..
[WITH] 공통 테이블 표현식(CTE) 사용법
·
DB/SQL
- WITH 절은 공통 테이블 표현식(CTE)를 정의하는 SQL 문법- 쿼리 내에서 일시적인 이름 있는 서브쿼리를 만들어 재사용하거나 복잡한 쿼리를 가독성 있게 작성하는 데 사용됨 WITH CTE_이름 AS ( 서브쿼리)SELECT *FROM CTE_이름; CTE_이름: 공통 테이블 표현식(CTE)의 이름.서브쿼리: CTE에 저장할 쿼리.SELECT: 정의한 CTE를 마치 일반 테이블처럼 사용.-- 주문 테이블에서 총 주문 수와 주문 금액이 평균 이상인 주문을 찾기WITH total_orders_cte AS ( SELECT COUNT(*) AS total_orders FROM orders), -- 총주문수avg_amount_cte AS ( SELECT AVG(amount) AS av..
[Pivot] 피벗테이블 만들기
·
DB/SQL
MYSQL- MYSQL에는 피벗 함수가 따로 있지 않아서 만들어줘야 한다SELECT 집계기준, 집계함수(CASE WHEN 기준컬럼 = '조건' THEN 집계할 값 ELSE NULL END) AS COL1FROM TABLEGROUP BY 집계기준; SUM 사용 (NULL vs 0)ELSE NULL 사용: 조건에 맞지 않으면 해당 행은 무시됨ELSE 0 사용: 조건에 맞지 않으면 0으로 처리됨COUNT 사용 시 주의COUNT는 NULL 값을 세지 않기 때문에 ELSE NULL을 사용하는 것이 일반적입니다. 동적 SQL로 피벗 만들기-- 1. 피벗할 기준 컬럼의 값들을 가져오기 (예: 기준컬럼의 DISTINCT 값)SELECT GROUP_CONCAT( DISTINCT CONCA..
[SQL] 고오급 표현
·
DB/SQL
인덱스 주기row_number() over(order by column)union 쓰다보면 union 한 값은 정렬하면 order by에 걸리기때문에 index 걸어서 인덱스를 order by 하는 것SELECT sido_nm, row_number() OVER(ORDER BY sido_nm) as row, (row_number() OVER(ORDER BY sido_nm)) + 5 as row2 FROM (SELECT DISTINCT sido_nm FROM public.TABLE ORDER BY sido_nm ASC) TUNION ALL SELECT '전국', '0', '5' ORDER BY row ASC;SELECT sido_nm, row_number() OVER(ORDER BY sido_..