오늘 한 일은,
- [ADsP 자격증 챌린지] 6주차 수강하기
- [데이터 리터러시] 1주차(1-1~1-3) 수강하기
- 파이썬 공부
- [코드카타] 어제 푼 문제 복습 (42~44번)
- [코드카타] 파이썬 3문제 풀기 (45~47번)
- SQL 공부
- [코드카타] SQL 5문제 풀기
(57~61번)(57~58번)
- [코드카타] SQL 5문제 풀기
ADsP 공부: [ADsP 자격증 챌린지] 6주차 수강하기
데이터 마트의 이해
데이터 마트
- 모델링을 진행하기 전에 잘 정리된 데이터 마트를 개발해 놓으면 효율적이고 신속한 모델링을 할 수 있음
- 데이터 마트 : 데이터 웨어하우스로부터 특정 사용자가 관심을 갖는 데이터들을 주제별, 부서별로 추출하여 모은 비교적 작은 규모의 데이터 웨어하우스
- 효율적인 데이터 마트 개발을 위해서는 R에서 제공하는 reshape, sqldf, plyr 등의 다양한 패키지를 활용할 수 있음
- 데이터 마트로 분리 시 시간·공간적인 효율성을 기대할 수 있음
데이터 전처리(data preprocessing)
- 데이터 마트에서 원하는 데이터를 수집하고 변형하여 적재했다면, 이제 전처리 단계를 거쳐야 함
- 데이터 전처리에는 2가지 과정이 포함됨; ①데이터를 정제하는 과정, ②분석 변수를 처리하는 과정
- ①데이터 정제 과정 : 결측값과 이상값을 처리함
- ②분석 변수 처리 과정 : 변수 선택, 파생변수 생성 등
- 요약 변수
- 원래 데이터로부터 기본적인 통계 자료를 추출한 데이터 마트에서 가장 기본적인 변수
(총 합계, 평균, 횟수, 구매여부 등) - 기초적인 통계 자료들
- ex. 상품별 구매 금액, 상품별 구매 순서, 기간별 구매 금액
- 원래 데이터로부터 기본적인 통계 자료를 추출한 데이터 마트에서 가장 기본적인 변수
- 파생 변수
- 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미(목적)를 부여한 변수
의미 혹은 목적이 부여된 변수 - 주관적일 수 있으므로 논리적 타당성을 갖추는 것이 중요
- ex. 최적 통화 시간, 선호하는 가격대 변수, 주 활동 지역 변수 등
- 특정 조건을 만족하거나 특정 함수에 의해 값을 만들어 의미(목적)를 부여한 변수
- 요약 변수
데이터 탐색
탐색적 데이터 분석(Exploratory Data Analysis, EDA)
- 탐색적 데이터 분석 : 데이터를 본격 분석하기 전에 데이터의 대략적인 특성을 파악하고 의미 있는 관계를 찾아내기 위해 다각도로 접근하는 것을 의미
- R에서 데이터 분석 시에 자주 사용하는 함수
- head / tail
- 시작 또는 마지막 6개 record만 조회
- head(,) 숫자를 넣어주면 원하는 개수만큼 확인 가능
- summary
- 수치형 변수 : 최댓값, 최솟값, 평균, 1사분위수, 2사분위수(중앙값), 3사분위수
- 명목형 변수 : 명목값, 데이터 개수
*명목형 변수: 그 자체로 순서나 크기에 의미가 없는 범주 (ex.성별, 혈액형 등)
- head / tail
- R에서 데이터 분석 시에 자주 사용하는 함수
결측값(Missing data)
- 결측값 : 존재하지 않는 데이터
- 가능하면 결측값은 제외하고 처리하는 게 적합 결측치가 얼마 없다거나 하는 경우 등
- 다만 결측값 자체가 의미있는 예외의 경우도 있기 때문에 무조건 제외해버리는 것도 주의해야 함
- 결측값 대치 방법
- 단순 대치법(Single Imputation)
- 결측값이 존재하는 데이터를 삭제하는 방법
- [주의] 결측값이 많은 대량의 데이터인 경우 데이터 손실 발생 우려
- 평균 대치법(Mean Imputation)
- 관측 또는 실험을 통해 얻은 데이터의 평균으로 결측값을 대치하여 완전한 자료로 만드는 방법
- 단순 확률 대치법
- 평균 대치법에서 추정량 표준 오차의 과소 추정 문제를 보완하고자 고안된 방법으로, 어떤 적절한 확률값을 부여한 후 대치하는 방법
- 대표적인 방법 : K-Nearest Neighbor
- 다중 대치법
- 여러 번의 대치를 통해 n개의 가상적 완전 자료를 만드는 방법
- 단순 대치법(Single Imputation)
이상값(Outlier)
- 이상값 : 일반적인 데이터 분포에서 벗어나 있는 값으로, 다른 데이터와 비교했을 때 통계적으로 불규칙한 값을 의미
- 이상값을 꼭 제거해야 하는 것은 아니기 때문에 분석의 목적이나 종류에 따라 적절한 판단이 필요
- 이상치 사용 분야 : 사기 탐지, 의료(특정 환자에게서 나타나는 예외적 증세), 네트워크 침입 탐지 등
- 이상값 판단 방법
- ESD (Extreme Studentized Deviation)
- 평균으로부터 3 표준편차 만큼 떨어진 값을 이상값으로 인식하는 방법
- 사분위수
- 측정값을 최솟값에서 최댓값까지 오름차순으로 정렬한 자료를 4등분했을 때 각 위치에 해당하는 값을 의미
- IQR (Interquartile Range) : 사분범위라고 부르며, 1분위 수(Q1)부터 3분위 수(Q3)까지의 범위
- 중앙값 (median) : 2분위 수(Q2)
- 일반적으로 사분범위에서 1.5분위수를 벗어나는 경우 이상치로 판단
- = Q1 - 1.5 X IQR (하한 최솟값) 보다 작거나 Q3 + 1.5 X IQR (상한 최댓값)보다 큰 값을 이상값으로 간주
- 이상값은 상자그림(boxplot)으로 식별 가능
- 측정값을 최솟값에서 최댓값까지 오름차순으로 정렬한 자료를 4등분했을 때 각 위치에 해당하는 값을 의미
- ESD (Extreme Studentized Deviation)
데이터 리터러시 공부: [데이터 리터러시] 1주차 수강하기
데이터 리터러시란?
데이터 리터러시(Data Literacy)
- 데이터 리터러시란?
- 데이터 수집과 데이터 원천을 이해하고,
- 주어진 데이터에 대한 다양한 활용법을 이해하고,
- 데이터를 통한 핵심지표를 이해하는 것
- 데이터 리터러시는 올바른 질문을 '스스로에게' 던짐으로써 뚜렷한 목적 의식을 갖게 한다
- 데이터 분석에 대한 착각들
- ❌ '데이터를 잘 분석하면 문제, 목적, 결론이 나올 거야'
- ❌ '데이터를 잘 가공하면 유용한 정보를 얻을 수 있을 거야'
- ❌ '분석에 실패한 건 방법론, 스킬이 부족해서야'
- => 사실 방법론이나 스킬이 부족한 것이 아니라 데이터 리터러시가 부족해서 봉착하게 되는 상황일 수도 있음
데이터 해석의 오류 사례
- 심슨의 역설 (Simpson's Paradox)
- '부분'에서 성립한 대소 관계가 그 부분들을 종합한 '전체'에 대해서는 성립하지 않는 모순적인 경우
- ❗전체에 대한 결론이 언제나 개별 집단에 그대로 적용되진 않음
❗ 데이터에 기반한 결론이라고 하여 맹목적으로 수용해선 안 됨 - [사례] 2021년 8월에 발표한 영국 공공보건국의 코로나 변이 바이러스 관련 브리핑
- 백신 미접종자의 치명률 0.17%, 백신 2차 접종 완료 치명률 0.86%
⇒ 백신 접종 완료자의 치명률이 미접종자에 비해 5배 이상 더 높게 나타난 의문스러운 결과 - 같은 데이터를 50세 미만과 50세 이상으로 나누어 살펴보면 결과가 달라짐
- 50세 미만 집단 : 백신 미접종자의 치명률이 0.03%, 접종 완료자의 치명률이 0.05%
⇒ 접종 완료자의 치명률이 더 높긴 하나, 양쪽 모두 낮은 수준의 치명률을 보임 - 50세 이상 집단 : 백신 미접종자의 치명률이 5.96%, 접종 완료자의 치명률이 1.81%
⇒ 미접종자의 치명률이 접종 완료자에 비해 3배 이상 높게 나타남 - 개별 연령 집단 내에서 살펴보면,
✔ 50세 미만은 백신 접종 여부에 관계없이 치명률이 매우 낮았고,
✔ 50세 이상의 위험군에서는 백신이 치명률을 낮추는 효과가 있음
- 50세 미만 집단 : 백신 미접종자의 치명률이 0.03%, 접종 완료자의 치명률이 0.05%
- 백신 미접종자의 치명률 0.17%, 백신 2차 접종 완료 치명률 0.86%
- 시각화를 활용한 왜곡
- 자료의 표현 방법에 따라 해석의 오류 여지가 존재함
- [사례] The Economist의 매해 노동자와 자본가의 시간당 버는 액수의 증가를 보여주는 3가지 그래프
- (左) 원본
⇒ 노동자의 임금이 현저히 낮은 것을 확인 가능 - (中) 증가량에 로그를 취한 자료
⇒ 노동자들의 임금 증가가 급격하게 이루어져 왔다고 해석 가능 - (右) 노동자와 자본가의 최초 수입을 100%로 놓고 이후의 증가율에 대한 자료
⇒ 노동자들의 임금 증가가 자본가의 수입 증가를 훨씬 능가한다고 해석 가능
- (左) 원본
- 샘플링 편향 (Sampling Bias)
- 전체를 대표하지 못하는 편향된 샘플 선정으로 인해 오류가 발생함
- ❗ 표본이 편향되면 실제와는 다르게 해석하게 될 수 있음
- [사례] Literary Digest 잡지사의 대규모 여론 조사의 사례
- 1936년 미국 대통령 선거 당시에 천만 명에게 우편을 통해 진행함
- 240만 명에게서 랜던이 선거에서 57% 득표할 것이라고 높은 신뢰도로 예측했지만, 루즈벨트가 62% 득표로 당선
- 조사의 문제점 : Literary Digest의 샘플링 방법
- ① 여론조사용 주소를 얻기 위해 전화번호부, 자사의 구독자 명부, 클럽 회원 명부 등을 사용
⇒ 이런 명부는 모두 공화당(=랜던 측)에 투표할 가능성이 높은 부유한 계층에 편중된 경향이 존재 - ② 우편물 수신자 중 25% 미만의 사람이 응답
⇒ 정치 무관심층, Literary Digest를 싫어하는 사람 및 다른 중요한 그룹을 제외함으로써 표본을 편향되게 만듦
- ① 여론조사용 주소를 얻기 위해 전화번호부, 자사의 구독자 명부, 클럽 회원 명부 등을 사용
- 상관관계와 인과관계
- 상관관계
- 두 변수가 얼마나 상호 의존적인지를 파악하는 것을 의미
- 한 변수가 증가하면 다른 변수도 따라서 증가/감소하되 그 추이를 따름
- 인과관계
- 실질적으로 하나의 요인으로 인해 다른 요인의 수치가 변하는 관계를 의미
- 원인과 결과가 명확한 것
- ❗ 상관관계는 인과관계가 아니다! 상관관계만으로 섣불리 의사결정 하지 않기
❗ 그렇다고 상관관계는 배제하라는 것이 아니라 상관관계와 인과관계 모두 활용해 합리적으로 판단하기 - [사례] 1940년대 보건전문가의 소아마비와 아이스크림 섭취 간 연구 결과
- 한 전문가가 소아마비와 아이스크림 섭취량의 상관관계가 있음을 발견
→ 전국에 소아마비 예방을 위해 아이스크림을 많이 먹지 말라고 권고함- 소아마비는 여름에 많이 발생함
아이스크림은 여름에 판매량이 급증함 - ⇒ 소아마비와 아이스크림 섭취 간에는 어떤 인과관계도 존재하지 않음
⇒ 단순히 날씨라는 변수로 인해 공통으로 영향을 주게 됨
- 소아마비는 여름에 많이 발생함
- 한 전문가가 소아마비와 아이스크림 섭취량의 상관관계가 있음을 발견
- 상관관계
데이터 리터러시가 필요한 이유
- 데이터 분석 접근법 (3단계)
- ① 문제 및 가설 정의 ← ‘생각’이 주요한 단계에서 데이터 리터러시가 필요
- ② 데이터 분석
- ③ 결과 해석 및 액션 도출 ← ‘생각’이 주요한 단계에서 데이터 리터러시가 필요
- '데이터 분석'이 목적이 되지 않도록 항상 '왜?'를 생각해야 함
- 데이터 분석에 실패하는 것은,
데이터 분석 작업에 앞서서 문제 및 가설을 정의할 때 풀고자 하는 문제를 명확히 정의하지 않고 바로 데이터 분석에 뛰어들어서이다.
- 데이터 분석에 실패하는 것은,
문제 정의란?
문제 정의
- 데이터 분석 프로젝트의 성공을 위한 초석
- 분석하려는 특정 상황이나 현상에 대한 명확하고 구체적으로 진술함 (= 해결하고자 하는 지점을 명확하게 정의함)
- 프로젝트의 목표를 설정하고 분석 방향을 설정함
- 문제 정의의 목적은 더 나아지기 위한 새로운 액션 플랜을 수립하기 위해서생각보다 더 복잡하고 시간도 많이 소요되는 과정으로, 항상 “문제를 올바르게 정의했는가?”라는 물음을 가지고 임해야 함
- [사례]
- 상황 : 매출 증가가 목표인 패션 플랫폼 A
- 문제 정의(a) : 매출을 어떻게 늘릴 수 있을까?
- 문제 정의가 모호하고 구체적이지 않음; 어떤 고객층, 제품에 초점을 맞출지에 대한 명확한 지침이 부재
- ⇒ 데이터 분석할 시 방향성을 잡기가 어려움
- 수정한 문제 정의(b) : 지난 6개월 동안 25 - 35세 여성 고객층의 구매 전환율이 급격히 감소했다. 이 고객층의 전환율을 2%에서 5%로 끌어올리기 위해 어떤 마케팅 전략을 적용할 수 있을까?
이렇게 구체적인 목표치, 전략 같은 것이 나왔을 때에야 데이터 분석을 시작할 수 있고, 분석의 방향성을 잃지 않고 진행할 수 있음
문제 정의의 핵심: 'So What?'와 'Why So?'
- 두 가지 질문 So What?과 Why So?를 계속해서 상호 검증해나가면서 도식화한 로직 트리가 두 질문에 부합하는지 확인함
- ❓ So What? 결국 무엇이라는 거지?
- 그래서, 따라서, 이렇듯 앞에 오는 정보나 소재에서 과제의 답변에 맞는 중요한 핵심을 추출하는 작업
- 나타난 현상을 바탕으로 과제에 비추어 말할 수 있는 내용의 핵심을 추출하는 작업
- ❓ Why So? 왜 그렇게 되지?
- 구체적으로 무슨 뜻인지를 검증하고 확인하는 작업
- So what?한 요소의 타당성을 자료 전체 혹은 그룹핑한 요소로 증명할 수 있다는 사실을 검증하는 작업
문제 정의 방법론
- MECE(Mutually Exclusive, Collectively Exhaustive)
- 문제를 상호 배타적(mutually exclusive)이면서 전체적으로 포괄적(collectively exhaustive)인 구성요소로 나누는 것
- MECE를 통해 복잡한 문제를 체계적으로 분해하고, 구조화된 방식으로 분석할 수 있음
- 로직 트리(Logic Tree)
- MECE 원칙을 기반으로 복잡한 문제를 더 작고 관리하기 쉬운 하위 문제로 분해하는 데 사용
- 상위 문제로부터 시작하여 하위 문제로 계층적 접근
- 일반적으로 도표 형식으로 표현되어 쉽게 파악할 수 있음
- [예제] '수입(=매출액) 감소 원인이 무엇일까?'
- 수입 = '매출액'으로 정의한 후 구조화 진행
- 사용자 수 감소 부분에서 서비스 A, 서비스 B로 나누어 생각해 봄
- '포인트 이벤트를 진행했음에도 사용자 수 증대에 효과가 없는 것'은 문제 삼지 않음
- 서비스 B 부분을 더 세분화하여 서비스 A와 다른 점이 무엇인지 찾아볼 수 있도록 구조화 진행
- 로직 트리 Cheat Sheet : 네스카페의 로직트리 자료
- 시장/점유율에 따라 분류
- 개념적으로 분류
- 반대되는 말로 분류
- 세그먼트에 기반하여 분류
💡문제 정의 관한 팁
- 결과를 공유하고자 하는 사람이 누구인지 정의하기 이 데이터 분석의 결과를 누구에게 전하고 싶은 것인지
- 결과를 통해 원하는 변화를 생각하기
- 회사 소속이라면 경영자의 입장에서 보려고 노력
- 많은 사람들과 의견을 나눠보는 것도 방법
- 반드시 혼자서 오래 고민해보는 시간을 가질 것
데이터의 유형
정성적 데이터(Qualitative Data) vs 정량적 데이터(Quantitative Data)
- 정성적 데이터
- 비수치적인 정보로, 사람의 경험, 관점, 태도와 같은 주관적인 요소를 포함함
- 대부분 텍스트, 비디오, 오디오 형태로 존재
- 데이터가 정형되지 않고 구조화 되어있지 않고, 또한 데이터를 구조화하는 것도 어려움
- 새로운 현상이나 개념에 대한 이해를 심화하는 데 사용
- 정량적 데이터
- 수치적으로 표현되는 정보로 양적인 측정과 분석을 통해 얻음
- 데이터가 숫자 형태로 존재하기 때문에 통계적으로 분석하기 쉬움
- 개인의 해석이나 주관이 적게 작용하는 객관성을 가짐
- 지표로 만들기에 용이함
- 설문조사, 실험, 인구 통계, 지표 분석 등에 활용
정량적 데이터의 활용
- 정량적 데이터 : 객관적이고 측정가능한 지표를 만들기에 적합함
- ex. 일일 활성 사용자 수(Daily Active User, DAU), 재방문 비율(Retention), 추천 지수(Net Promoter Score, NPS)
- 분포, 평균, 중앙값 등을 계산해서 데이터의 경향성과 패턴을 파악할 수 있음
- 비즈니스 분석, 예측 모델링, 추세 분석을 포함한 머신러닝과 같은 현대적 데이터 분석 기법에 활용할 수 있음
- 이를 통해 미래 예측, 효율적 자원 배분, 시장 변화에 대한 적응이 가능
파이썬 공부: 코드카타 풀기(45~47번)
45. 시저 암호
어떤 문장의 각 알파벳을 일정한 거리만큼 밀어서 다른 알파벳으로 바꾸는 암호화 방식을 시저 암호라고 합니다. 예를 들어 "AB"는 1만큼 밀면 "BC"가 되고, 3만큼 밀면 "DE"가 됩니다. "z"는 1만큼 밀면 "a"가 됩니다. 문자열 s와 거리 n을 입력받아 s를 n만큼 민 암호문을 만드는 함수, solution을 완성해 보세요.
우선 알파벳의 순서에 따라 부여된 숫자가 있는지를 찾아봤다.
[참고] [파이썬] 유니코드를 활용한 문자열-숫자 변환 (ord, chr 내장함수)
- chr(n) : 숫자 n에 해당하는 유니코드 포인트를 갖는 문자열을 반환
- ord(a) : 문자 a에 해당하는 유니코드 포인트를 갖는 정수를 반환
- 알아두면 편한 사항
- 영어 알파벳은 총 26개
- 대문자 'A'의 유니코드 포인트 : 65
- 소문자 'a'의 유니코드 포인트 : 97
- 알아두면 편한 사항
def solution(s, n):
answer = ''
for i in s:
if i == ' ':
answer += ' '
else:
if i.isupper():
answer += chr((ord(i)-ord('A')+n)%26+ord('A'))
elif i.islower():
answer += chr((ord(i)-ord('a')+n)%26+ord('a'))
return answer
문제를 풀면서 주의할 점은 2개다.
- 공백은 공백으로 둘 것
- 대문자 Z 다음은 대문자 A, 소문자 z 다음은 소문자 a라는 것
그래서 우선 공백일 때 똑같이 공백을 추가하도록 조건을 작성했다.
그리고서 대문자일 때와 소문자일 때를 구분해서 문자를 바꾸도록 조건을 주었다.
대문자인지, 소문자인지를 판단하기 위해 .isupper() / .islower() 매소드를 사용했다.
마지막으로 문자를 바꾸기 위한 조건을 다음과 같이 작성했다.
- ① ord() 함수를 사용해 바꾸려는 문자를 숫자로 바꾸고, ord('A')/ord('a')만큼 빼고, n만큼 더해주었다.
- ② ①의 값을 26으로 나눈 나머지에 다시 ord('A')/ord('a')만큼 더해주고
- ③ ②의 숫자를 문자로 바꾸기 위해 chr() 함수로 감싼다.
최종적으로 ③에서 구해지는 문자를 answer에 추가해주도록 했다.
46. 숫자 문자열과 영단어
숫자의 일부 자릿수가 영단어로 바뀌어졌거나, 혹은 바뀌지 않고 그대로인 문자열 s가 매개변수로 주어집니다. s가 의미하는 원래 숫자를 return 하도록 solution 함수를 완성해주세요.
숫자와 영단어가 한 쌍으로 짝지어졌으니 딕셔너리를 사용해야겠다는 생각은 바로 떠올랐으나,
딕셔너리를 사용할 때 필요한 기본 함수들을 몰라서 이에 대한 부분을 우선 찾아보았다.
[참고] 파이썬 Dictionary, get(), keys(), values(), items() 사용법, 파이썬 mapping type - 공부하는 도비
- 딕셔너리.get(key값) : 해당 key에 해당하는 value값을 찾아냄. 해당하는 value값이 없을 경우 "None"을 반환.
- 딕셔너리.keys() : 해당 딕셔너리의 key값들을 알려줌
- 딕셔너리.values() : 해당 딕셔너리의 value값들을 알려줌
- 딕셔너리.items() : 해당 딕셔너리의 key값과 value값을 한 쌍으로 짝지어 알려줌
def solution(s):
num = {'zero':0, 'one':1, 'two':2, 'three':3, 'four':4, 'five':5, 'six':6, 'seven':7, 'eight':8, 'nine':9}
for i, j in num.items():
s = s.replace(i, j)
answer = int(s)
return answer
찾아본 내용을 바탕으로 처음 작성한 코드다.
작성 후 실행했더니, .replace() 매소드는 숫자가 올 수 없다는 에러 메시지가 떴다.
def solution(s):
num = {'zero':'0', 'one':'1', 'two':'2', 'three':'3', 'four':'4', 'five':'5', 'six':'6', 'seven':'7', 'eight':'8', 'nine':'9'}
for i, j in num.items():
s = s.replace(i, j)
answer = int(s)
return answer
그래서 딕셔너리의 모든 값들을 string 타입으로 변경해주었더니 통과됐다.
SQL 공부: 코드카타 풀기(57~61번)
59. 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 2022년 10월 16일에 대여 중인 자동차인 경우 '대여중' 이라고 표시하고, 대여 중이지 않은 자동차인 경우 '대여 가능'을 표시하는 컬럼(컬럼명: AVAILABILITY)을 추가하여 자동차 ID와 AVAILABILITY 리스트를 출력하는 SQL문을 작성해주세요. 이때 반납 날짜가 2022년 10월 16일인 경우에도 '대여중'으로 표시해주시고 결과는 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT a.car_id,
CASE WHEN (a.start_date <= '2022-10-16') AND (a.end_date >= '2022-10-16') THEN '대여중'
ELSE '대여 가능' END availability
FROM(
SELECT car_id,
DATE_FORMAT(start_date, '%Y-%m-%d') start_date,
DATE_FORMAT(end_date, '%Y-%m-%d') end_date,
MAX(start_date) OVER (PARTITION BY car_id) start_date_2
FROM car_rental_company_rental_history
) a
WHERE a.start_date = a.start_date_2
ORDER BY car_id DESC
처음으로 제출한 쿼리다.
코드를 실행했을 때 결과 테이블이 조회되길래 제출했더니 틀렸다는 메시지에 막막한 마음으로 다시 작성한 내용을 바라봤다.
인라인 뷰를 사용한 이유는 처음에 작성했더니 car_id별로 하나의 데이터가 아니라 여러 데이터들이 조회되길래 이전 히스토리들은 뜨지 않고 최근 건 하나만 뜨도록 하기 위한 방법을 고민하다 이렇게 작성하게 됐다.
car_id별로 start_date에서 최댓값(=가장 최근 날짜)을 구하는 start_date_2을 구해서, start_date와 start_date_2가 일치하는 행만 조회되도록 하는 의도로 작성했다.
그래서 그 상태에서 availability 컬럼의 조건을 위해 '대여중' 값에 해당하는 조건을 작성하면
- 2022년 10월 16일이 start_date와 같거나, start_date보다 커야 하고(≒2022년 10월 16일이 더 나중 일이어야 함)
- 2022년 10월 16일이 end_date와 같거나, end_date보다 작아야 한다(≒end_date가 더 나중 일이어야 함)
그리고 마지막으로 ORDER BY절로 정렬 순서도 반영했다.
(근데 왜 틀렸냐...)
그런데 지금 시간이 너무 늦어서(현재 시각 23:32) 내일 일어나서 질문방에 질문하기로 한다...
저 왜 틀렸죠, 튜터님..?
'[내배캠] 데이터분석 6기 > 본캠프 기록' 카테고리의 다른 글
[본캠프 14일차] SQL 코드카타, 파이썬 코드카타, QCC ①, 데이터 리터러시 공부 (0) | 2025.03.07 |
---|---|
[본캠프 13일차] 파이썬 코드카타, SQL 코드카타, 데이터 리터러시 공부, 아티클 스터디② (0) | 2025.03.06 |
[본캠프 11일차] ADsP 공부, SQL 공부, SQL 코드카타, 파이썬 코드카타, 아티클 스터디 ① (0) | 2025.03.04 |
[본캠프 10일차] ADsP 공부, SQL 공부, 코드카타 복습(SQL만) (0) | 2025.02.28 |
[본캠프 9일차] 아티클 스터디④, 파이썬 코드카타, SQL 코드카타, ADsP 공부 (0) | 2025.02.27 |