04. 매출 관련 추가 분석
Q17. 2020년 7월 일별 매출의 전일 대비 증감폭, 증감률을 구해주세요.
WITH문 : 서브 쿼리를 사용해서 임시 테이블 처럼 사용할 수 있는 구문, 옵티마이저가 인라인 뷰나 임시 테이블로 판단.
Window 함수(행 순서 함수) 이해
LAG : 이전 행을 가져옴
LEAD : 특정 위치의 행을 가져옴(defult는 1 : 다음행을 가져옴)
WITH tbl_revenue AS (
SELECT DATE_FORMAT(purchased_at - interval 9 hour, '%Y-%m-%d') AS d_date
, SUM(price) AS revenue
FROM tbl_purchase
WHERE purchased_at >= '2020-07-01'
AND purchased_at < '2020-08-01'
GROUP BY 1
)
SELECT * , revenue - LAG(revenue) OVER(ORDER BY d_date ASC) AS diff_revenue -- 전일대비 증감폭
, ROUND((revenue - LAG(revenue) OVER(ORDER BY d_date ASC) )
/ LAG(revenue) OVER(ORDER BY d_date ASC) * 100 , 2 ) AS diff_per_revenue -- 전일 대비 증감률
FROM tbl_revenue;
Q18. 일별로 많이 구매한 고객들한테 소정의 선물을 줄려고 해요, 7월에 일별로 구매 금액 기준으로 가장 많이 지출한 고객 TOP 3를 뽑아주세요.
RANK 함수 이해
ex) RANK() OVER (partition by c1, c2 order by price desc)
RANK : 동일한 값이면 같은 순위를 매기고, 다음 값에선느 다음 순위를 매김
DENSE_RANK : 동일한 값이면 같은 순위를 매기고, 동일한 순위를 하나의 RANK로 계산
ROW_NUMBER : 중복 허용 없음, 동일한 순위에 대해서 고유의 순위 부여
SELECT *
FROM (
SELECT DATE_FORMAT( purchased_at - interval 9 hour, '%Y-%m-%d') AS d_date
,customer_id
, SUM(price)
, DENSE_RANK() OVER (PARTITION BY DATE_FORMAT( purchased_at - interval 9 hour, '%Y-%m-%d') ORDER BY SUM(price) DESC ) AS rank_rev
FROM tbl_purchase
WHERE purchased_at >= '2020-07-01'
AND purchased_at < '2020-08-01'
GROUP BY 1, 2) foo
WHERE rank_rev < 4 ;
'Structured Query Language > MY_SQL_intermediate' 카테고리의 다른 글
SQL_Intermediate 05. 프로덕트 분석 심화 (0) | 2022.08.15 |
---|---|
SQL_Intermediate 03. 유저 세그먼트별 분석 (0) | 2022.08.11 |
SQL_Intermediate 02. 날짜 시간별 분석 (0) | 2022.08.11 |
SQL_Intermediate 01. 서비스 이해 문제 모음 (0) | 2022.08.11 |