Notice
Recent Posts
Recent Comments
Link
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Tags
more
Archives
Today
Total
관리 메뉴

기록 블로그

[TIL13] 전체적인 리뷰... 본문

카테고리 없음

[TIL13] 전체적인 리뷰...

LHJ_ 2024. 12. 3. 23:28

코드카타

1. 글에 적혀 있는 조건을 조금 더 꼼꼼하게 보기 
2. 날짜가 더 빠르다는 건 숫자가 더 작다는 의미
3. 아직 입약을 가지 않은 아이도 존재하기 때문에 INNER JOIN
=> 각 테이블 중 한 테이블에 존재하지 않은 데이터가 있을 수 있으므로 두 테이블의 데이터 값이 필요하면 INNER JOIN
*4. date_format( datetime 컬럼, '변환하고 싶은 데이터 타입') 제~~~~~~~발 형식 까먹지 말기

질문 사항
https://school.programmers.co.kr/learn/courses/30/lessons/59045
SELECT ao.animal_id, ao.animal_type, ao.name
FROM animal_Ins ai INNER JOIN animal_outs ao on ai.animal_id=ao.animal_id
WHERE ai.SEX_UPON_INTAKE <> ao.SEX_UPON_OUTCOME
#(ao.SEX_UPON_OUTCOME LIKE 'neutered%' or ao.SEX_UPON_OUTCOME LIKE 'spayed%') 왜.. 안 되는 것임?

 

과제

#1번 문제
SELECT customer_id, count(*) total_orders
FROM spa.orders o
WHERE order_delivered_customer_date > order_estimated_delivery_date
GROUP BY customer_id
ORDER BY total_orders DESC
LIMIT 1;
 
#2번 (개비효율적임)
SELECT payment_type, sum(payment_value) total_payment_value , ROUND (sum(payment_value)/(SELECT sum(t)
FROM
(SELECT sum(payment_value) t
FROM spa.payments p
GROUP BY payment_type) a)*100 ,2)payment_percentage
FROM spa.payments p
GROUP BY payment_type ;
#2번
SELECT DISTINCT payment_type,
round(sum(payment_value) over(PARTITION BY payment_type),2) total_payment_value,
round (sum(payment_value) over(PARTITION BY payment_type)/sum(payment_value) OVER()*100,2) payment_percentage
FROM spa.payments p
ORDER BY 3 DESC;


SELECT DISTINCT customer_id
FROM spa.customers c

#3
SELECT count(DISTINCT customer_id) cnt_users, count(*) cnt_orders, sum(payment_value) sum_payment, AVG(payment_value) arppu
FROM spa.orders o LEFT JOIN spa.payments p ON o.order_id = p.order_id
WHERE order_status = 'delivered' AND p.order_id IS NOT NULL;
SELECT count(DISTINCT customer_id) cnt_users, count(*) cnt_orders, sum(payment_value) sum_payment, AVG(payment_value) arppu
FROM spa.orders o INNER JOIN spa.payments p ON o.order_id = p.order_id
WHERE order_status = 'delivered' ;
=> orders 테이블에서 주문 확인을 했다고 해서 무조건 주문 확정이 아니기 때문에 payment 테이블에 값이 없을 수 있음 (결제창으로 넘어갔는데(결제 확인) 복잡하면 취소 할 수 있고 금액보고 너무 비싸서 취소 할 수도 있고 승인이 나지 않으면 어플상 문제로 환불처리가 되기도 하니까... 때문에 둘의 값이 모두 존재하는 값이 필요하기  때문에 INNER JOIN으로 묶어 줌

여기서 모든 데이터를 보기 위해 LEFT JOIN을 사용한다면 JOIN하면서 payment에 생긴 NULL 값을 제외하면 똑같음.(orders 주문 확인 데이터는 있지만 결제 데이터는 없는 상황)
#4
SELECT payment_type , payment_value
FROM spa.payments p2
WHERE payment_value>(SELECT AVG(payment_value)
FROM spa.payments p
WHERE payment_type = 'credit_card'
GROUP BY payment_type) AND payment_type = 'credit_card'
UNION 
SELECT payment_type , payment_value
FROM spa.payments p2
WHERE payment_value>(SELECT AVG(payment_value)
FROM spa.payments p
WHERE payment_type = 'boleto'
GROUP BY payment_type) AND payment_type = 'boleto'
UNION
SELECT payment_type , payment_value
FROM spa.payments p2
WHERE payment_value>(SELECT AVG(payment_value)
FROM spa.payments p
WHERE payment_type = 'voucher'
GROUP BY payment_type) AND payment_type = 'voucher'
UNION
SELECT payment_type , payment_value
FROM spa.payments p2
WHERE payment_value>(SELECT AVG(payment_value)
FROM spa.payments p
WHERE payment_type = 'debit_card'
GROUP BY payment_type) AND payment_type = 'debit_card' #동일한 결제수단에서 이루어진 다른 결제의 평균 금액보다 높은 결제들 중...까지 만들고 그 뒤에 order_id하니까 바로 오류나서..(당연함 union으로 묶었음) 모르겠음 아마 윈도우 함수로 평균을 구하고 값을 구하는 거 같은데 모르겠음
#5 아니 없는 데이터의 추가를 어케함 insert는 아닐거고 if/case when? 얘네도 조건이 있어야하는거잖음 어케함
SELECT date_format(order_approved_at, '%Y-%m') moth, count(*) cnt_orders
FROM spa.orders o LEFT JOIN spa.payments p ON p.order_id = o.order_id
GROUP BY 1
ORDER BY moth
#6 표준 편차가 뭐임
SELECT
order_id, payment_type

FROM spa.payments p
WHERE

 

윈도우 함수

윈도우 함수가 진행되는 순서
FROM -> JOIN -> ON -> WHERE -> GROUP BY -> HAVING ->
[윈도우 함수] -> SELECT -> (DISTINCT -> ORDER BY) ->LIMIT 

윈도우 함수 
윈도우 함수 (컬럼) OVER () 함수와 사용함

PARTITION BY : 파티션(그룹핑과 비슷한 기능)
ORDER BY : 기준 정렬
ROWS | RANGE : 계산 범위 설정

윈도우 함수의 특징
집계함수 값을 개별행에 표시
=> 기존 집계함수를 하용하면 GROUP BY를 하며 테이블이 변화해서 그 변화된 모양을 계산하면 짜다보면 꼬이는 경우가 많았는데, 기존 컬럼값은 변화하지 않기 때문에 쿼리 짤 때 훨씬 유용할 듯
=> 기본 데이터 값과 집계 함수 값을 한번에 비교 가능
다양한 함수 제공

 

 

프로젝트

어떤 데이터 값들(테이블)을 보고 이 테이블이 가지고 있는 특성부터 파악하기 / 컬럼이 가지고 있는 특성을 보고 어떤 결과를 볼 수 있는지 추측
( ex) 이커마스 데이터는 유저 세션(행동)이 찍힌 데이터이기 때문에 구매 분석에는 맞지 않는 데이터 => 구매한 부분의 테이블만 추출하여 분석하기) 

테이블이 정해지면 각 컬럼의 기준 정하기
( ex) 몇번 구매부터 vip로 볼 것인지, 가격의 단위(10달러, 100달러 등), 어떤걸 기준으로 재구매를 했다고 할지 등)

그 다음에 주제에 맞춰서 쿼리 짜보기

=> 너무 어려움 일단 어떤 데이터 값을 봐야하는지도 모르겠고 뭐가 의미있는 데이터값인지 모르겠음
잘 하고 있는지에 대한 의문감도 들고 원하는 데이터를 얻기 위해 복잡한 쿼리를 작성해야하는데 지식이 딸림 총체적 난국
기준을 어떤 거 부터 정하고 들어가야할지도 모르겠고 정하더라도 데이터 특성을 파악을 어케함?! 이거 어케 기르는 능력인데 이거 뭔데
암튼 계속 해봐야 할 것 같음

또 같은 유저가 물건을 두 번 샀다고 해서 재구매한 것은 아님 한번에 두개를 구매할 수도 있기 때문에 user_session을 봐야함 젠장 어케 비교하지 막막함






주제를 정하는데 있어서 왜 이것을 정하게 되었는지, 또 이 데이터를 가지고 다른 사람들은 어떤식으로 분석하였는지 확인한 뒤 우리랑 방향이 맞는 분석 등의 논문이나 글을 찾아보기 



분석을 다 마치고 발표하기 위해 장표에 녹일 것(항상 어떻게 녹일지 고민하기)
1. 뭘 하고자 했는지 / 뭘 분석하고자 했는지와 같은 인사이트 소개 (두괄식)
 =>예상치 못한 인사이트나 재미있는 인사이트가 나오면 좋음
2. 과정
분석을 하기 위한 쿼리문과 분석 방식에 대해서 소개
3. 그래서 인사이트를 이용해서 어떤 행동을 취할 수 있는가
이때 현업에서 뭘 하는지 비슷하게 행동을 도출하면 좋음
인사이트 도출 후 행동을 취하기 위해 이런이런 고민을 했어요 하는 부분을 넣어주기
(최대한 간단한 쿼리를 짜기 위한 최적화, 불필요한 부분 개선, 어떠한 노력을 들였는지(논문을 찾아봤다, 이런 아티클을 찾아봤다 등등)



데이터 분석이 끝나고
각자 서로 짠 쿼리를 공유 (각 사람마다 습관과 스타일이 있기 때문에 최대한 많이 접하는 게 좋음)
전체적인 프로젝트 리뷰 (내가 프로젝트를 할 떄 뭘 했는지 자세하게)