일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- da
- 팀프로젝트
- 전처리
- 머신러닝
- 태블로
- data analyst
- GA4
- cross join
- SQL
- 군집화
- Chat GPT
- 프롬프트 엔지니어링
- 클러스터링
- SQLD
- 프로젝트
- Python
- 데이터분석
- 기초프로젝트
- If
- jd
- 기초통계
- 히트맵
- 서브쿼리
- 크롤링
- 최종 프로젝트
- lambda
- pandas
- 시각화
- 데이터 분석
- streamlit
- Today
- Total
세조목
TIL(Today I Learned)9일차(23.12.08) 본문
1. SQL
1) 프로그래머스 51번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/59042#qna
51번 문제의 요구사항이다.
문제에서는 ANIMAL_INS와 ANIMAL_OUTS 두 개의 테이블이 제시되는데
INS에는 없고 OUTS에는 데이터가 있는 경우를 찾아야 한다.
처음에는 단순히 두 개의 테이블을 모든 데이터가 나오게끔 JOIN 하면 되겠지 싶어서 LEFT JOIN을 했다.
그런데 그렇게 하니 문제 요구사항과는 다르게 OUTS에는 데이터가 없고 INS에만 데이터가 있었다.
무엇이 문제인가 고민해보니 LEFT JOIN은 LET JOIN 좌측에 작성하는 테이블에만 있고 오른쪽 테이블에는 없는 데이터들만 표시하는 것이었다.
나의 경우 ANIMAL_INS LEFT JOIN ANIMAL_OUTS 로 작성하니 INS에만 데이터가 있는 경우가 출력됐던 것이다.
그렇다면 OUTS에만 있는 데이터를 출력하기 위해서는 어떻게 해야하는가?
바로 RIGHT JOIN 함수를 쓰면 된다.
ANIMAL_INS RIGHT JOIN ANIMAL_OUTS
쉽게 정리하자면
LEFT JOIN : 왼쪽에는 있는데 오른쪽에는 없는거
RIGHT JOIN : 오른쪽에는 있는데 왼쪽에는 없는거
2) 프로그래머스 53번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131536#qna
53번 문제 요구사항이다.
- 동일한 회원이 동일한 상품을 재구매한 데이터 필요
이번 문제의 경우 다른 문제들보다 생각을 더 많이 해야했다.
문제 자체의 난이도는 그렇게 어렵지 않은데 COUNT 개념을 햇갈렸던 탓인것 같다.
우선 이 문제의 정답 코드는 아래와 같다.
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE S
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) > 1
order by user_id, product_id desc
동일한 회원이 동일한 상품을 재구매하는 데이터를 어떻게 뽑을 수 있을까??
처음에는 (USER_ID = USER_ID) AND (PRODUCT_ID = PRODUCT_ID) 이렇게 말도 안 되는 코드를 작성했었다.
그래서 답안을 먼저 확인하고 코드를 하나씩 뜯어보면서 공부했는데
먼저 GROUP BY로 USER_ID와 PRODUCT_ID를 GROUP화해줬다.
위 이미지는 예시인데 저렇게 테이블로 표시가 될 것이다.
이 다음 코드가 HAVING COUNT(*) > 1 인데
처음에는 이 코드로 어떻게 동일한 회원이 동일한 상품을 재구매하는 데이터를 뽑을수 있는 것인지 이해가 되지 않았다.
왜냐하면 내 머릿속에서는
이렇게 생각이 이루어지고 있었기 때문이다.
'모든 값이 다 1인데 어떻게 1을 초과하는 값을 HAVING 절로 걸러낼 수 있는거지?'
이렇게 생각한 것이다.
그런데 팀원들과 같이 이야기나누는 과정에서 내가 COUNT 개념을 잘못 인지하고 있었다는 것을 알게 되었다.
무슨 말인고하니
COUNT 그러니까 세아리는 함수는 누적의 개념이다.
그래서 USER_ID가 276이고 PRODUCT_ID가 dobiuz 인 경우가 나왔을때
첫번째 276, dobiuz일때는 1개
두번재 276, dobiuz일때는 2개
가 되는 것이다.
아래 581, 9z8djn도 마찬가지다.
이 경우 HAVING COUNT > 1 코드에 따라서 1이하인 GROUP들은 탈락하게 된다.
아직도 완벽하게 머릿속에 정리된 것은 아니기때문에 여러번 풀어보면서 머릿속에 박아넣어야겠다.
2. PYTHON
1) 프로그래머스 5번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/120807?language=python3
5번 문제의 요구사항이다.
두 수가 같으면 1, 다르면 -1을 return하란다.
def solution(num1, num2):
answer = 1
if num1 == num2:
return answer
answer = -1
if num1 != num2:
return answer
우선 내가 처음에 작성한 코드이다.
문제의 defautl값에 answer가 있었기 때문에 asnwer을 지우지 않은 상태에서 문제를 풀려고 했다보니 저렇게 코드를 썼던 것 같다.
그런데 알고보니 훨씬 간결하게 작성할 수 있었다.
def solution(num1, num2):
return 1 if num1==num2 else -1
겁나 간단한구먼...
거기다 직관적이기까지하다.
return 1 | 1을 반환해라 |
if num1 == num2 | num1과 num2가 같다면 |
else -1 | 그렇지 않으면 -1을 반환해라 |
이렇게 간결하고 직관적이게 코드를 작성할 수 있도록 연습을 많이 해야겠다는 생각이 든다.
2) 프로그래머스 7번 문제
https://school.programmers.co.kr/learn/courses/30/lessons/120806?language=python3
num1을 num2로 나눈 값에 1,000을 곱하는 것 까지는 알겠다.
(num1 / num2) * 1000
그런데 정수 부분을 어떻게 return할 수 있을까??
이것도 복잡하게 생각할 필요가 없었다.
정수가 영어로 무엇인가??
integer
그럼 int로 묶어주면 되지
그르치... int로 묶어주면 되지...
int( (num1 / num2) * 1000)
'데이터 분석 공부 > TIL(Today I Learned)' 카테고리의 다른 글
TIL(Today I Learned)11일차(23.12.12) (0) | 2023.12.12 |
---|---|
TIL(Today I Learned)10일차(23.12.11) (1) | 2023.12.11 |
TIL(Today I Learned)8일차(23.12.07) (0) | 2023.12.07 |
TIL(Today I Learned)7일차(23.12.06) (4) | 2023.12.06 |
TIL(Today I Learned)6일차(23.12.05) (4) | 2023.12.05 |