조건문 IF ELIF ELSE
num = 2
if num % 2 == 0:
print("짝수입니다.")
elif num % 2 != 0:
print("홀수입니다.")
else:
print("짝수도 홀수도 아닙니다.")
반복문 - 같은 동작 여러번(for, while)
for 변수 in 반복할 대상
반복할 내용
for ___ in range(_,_)
범위 -> 위치(인덱스)값이 필요
for->순회할 공간, 횟수를 지정해주는 반복문
n=5
while n>0:
print(n)
n-=1
print("발사!")
while->반복 횟수 지정X, 특정 조건에서 동작
break : 즉시 멈춤
continue : 일단 넘어감
2-1 모델링의 이해부터 2-4 데이터 모델링의 요소와 ERD까지 복습하려고 다시 한번 들었다.
완
SELECT DATE(order_purchase_timestamp) AS 'purchase_date', SUM(CASE WHEN order_delivered_customer_date<=order_estimated_delivery_date THEN 1 ELSE 0 END) AS success, SUM(CASE WHEN order_delivered_customer_date>order_estimated_delivery_date THEN 1 ELSE 0 END) AS fail FROM olist_orders_dataset WHERE order_purchase_timestamp LIKE '2017-01%' GROUP BY DATE(order_purchase_timestamp) ORDER BY DATE(order_purchase_timestamp)일단 정답은 맞췄지만, 문제에서 주어진 '배송 완료 또는 배송 예정 시각 데이터가 없는 경우는 계산에서 제외합니다.'에 대한 조건을 쓰지 않았기 때문에
WHERE order_purchase_timestamp LIKE '2017-01%' AND order_delivered_customer_date IS NOT NULL AND order_estimated_delivery_date IS NOT NULL이런 식으로 WHERE절에 조건을 추가하는것이 완벽한 정답이다.
SELECT DISTINCT(DATE(order_purchase_timestamp)) AS dt, COUNT(DISTINCT o.order_id) AS pu, SUM(payment_value) AS 'revenue_daily', ROUND((SUM(payment_value)/COUNT(DISTINCT o.order_id)),2) AS arppu FROM olist_orders_dataset o INNER JOIN olist_order_payments_dataset p ON o.order_id=p.order_id WHERE DATE_FORMAT(order_purchase_timestamp,'%Y-%m-%d')>=2018 GROUP BY DATE(order_purchase_timestamp);이것도 어찌저찌 정답은 맞췄지만 디테일에서 부족하다.
GROUP BY가 날짜별로 그룹화를 해주고 있기 때문에 이미 중복제거 효과를 내고 있다. 그래서 SELECT에 있는 DISTINCT는 불필요하다. 그리고 문제에서 애초에 결제 고객수라고 나와있기도 하고, 한 명의 고객이 여러건의 주문을 했을수도 있으니까 order_id가 아니라 customer_id로 카운트해야한다. arppu말고 매출액도 소숫점 둘째자리까지 출력하라고 했는데 빼먹었다. 날짜도 WHERE order_purchase_timestamp >= '2018-01-01' 이게 가장 깔끔하고 명확하다. 안해도 결과는 같지만 날짜 기준 오름차순 정렬도 빼먹었다. 문제를 꼼꼼하게 읽자.
그래서 결론은 아래처럼 정리한 쿼리가 가장 깔끔하다.SELECT DATE(order_purchase_timestamp) AS dt, COUNT(DISTINCT o.customer_id) AS pu, ROUND(SUM(payment_value),2) AS 'revenue_daily', ROUND(SUM(payment_value)/COUNT(DISTINCT o.customer_id),2) AS arppu FROM olist_orders_dataset o INNER JOIN olist_order_payments_dataset p ON o.order_id=p.order_id WHERE order_purchase_timestamp>='2018-01-01' GROUP BY DATE(order_purchase_timestamp) ORDER BY DATE(order_purchase_timestamp);
SELECT a.employee_id AS mentee_id, a.name AS mentee_name, b.employee_id AS mentor_id, b.name AS mentor_name FROM ( SELECT * FROM employees WHERE join_date between '2021-10-01' AND '2021-12-31' ) a LEFT JOIN ( SELECT * FROM employees WHERE join_date <='2019-12-31' ) b ON a.department != b.department ORDER BY a.employee_id, b.employee_id;하나의 테이블을 멘티, 멘토용으로 나눠서 비교해야 하기 때문에 자기 자신을 JOIN한다. 매칭가능한 멘토가 없더라도 결과에는 포함되어야 하기 때문에 LEFT JOIN을 사용하고, 날짜는 between으로 해도 되지만 좀더 정확하게 하려면 DATE_SUB나 DATE_ADD를 사용하는 것이 좋겠다. 다르다는 조건을 표현할때는 !=, <> 둘다가능
SELECT a.artist_id, a.name FROM artists a LEFT JOIN artworks_artists b ON a.artist_id=b.artist_id WHERE b.artist_id IS NULL AND a.death_year IS NOT NULL문제에 '~전시된 작품이 없는 작가들의 마지막 작품을 전시하는 기획전~'이라고 하길래 마지막 작품을 찾아야하는건가 라는 독해력 이슈가 터질뻔했지만, 이건 그냥 문제를 위한 스토리텔링ㅋㅋ 결국 구해야하는건 MoMA에 등록된 작가 중에 이미 사망했고, MoMA에 등록된 작품이 없는 작가의 ID와 이름이다.
오전에 잠도 깨고 뇌를 좀 활성화 하기위해 solvesql문제를 풀었다. 대충 읽지말고 꼼꼼하게 읽자. 문제 속에 힌트가 다ㅏㅏㅏㅏㅏㅏ있다.
라이브 세션 파이썬 - 조건문과 반복문에 대해 배웠는데 파이썬은 항상 알듯 말듯 한 느낌이다. 들을때는 이해 안가는거 없고 괜찮은데 막상 스스로 쓰려면 막히는 느낌...
SQLD 자격증 챌린지 - 역시 이론파트는 지금 당장 외운다거나 내용을 이해한다기보다 그냥 흘러가는대로 듣는거 같다. 지루하지만 빨리 다 듣고 요약이나 문제를 풀어봐야할듯
데이터 리터러시 - SQLD 강의를 듣다가 눈에도 안들어오고 귀에도 안들어오고 머리에도 안들어와서 잠시 멈추고 데이터 리터러시 강의를 들었다. 강의 길이도 길지 않고 내용도 어렵지 않아서 부담스럽지 않게 다 들었다. 데이터 리터러시를 한마디로 하자면 결국 데이터 그 자체에만 집중하지 말고 데이터의 유형과 목적과 문제에 맞게 지표를 잘 설정하고 생각생각생각을 많이 해야한다는 의미라고 생각된다.
SQLD 남은 진도를 나갈것인지 복습을 할것인지 둘 중 하나를 하자
solvesql 문제 꾸준히 풀기
#내일배움캠프 #TIL #데이터분석 #실무형데이터분석가양성과정