본문 바로가기

Data Science/SQL86

[SQL/분석] D+1 리텐션(Retention) 구하기: 첫 로그인과 재방문의 연결고리 (LeetCode550 Medium) [리트코드] Medium|550. Game Play Analysis IV; 리텐션https://leetcode.com/problems/game-play-analysis-iv/description/ 1. Problem전체 플레이어 중 **'생애 첫 로그인 바로 다음 날'**에 다시 접속한 플레이어의 비율을 구해야 한다.핵심 과제:각 유저의 최초 로그인 날짜를 찾아야 함.그 날짜로부터 정확히 1일 뒤에 기록이 있는지 확인해야 함.중복 집계를 방지하여 정확한 '인원수' 비율을 계산해야 함.2. Solution: 최초 방문일 고정 후 조건부 집계WITH 절로 최초 방문일을 정의하고, 본 테이블과 조인하여 날짜 차이를 분석한다.3. Takeaway: COUNT(DISTINCT CASE WHEN...)의 정교한 매.. 2026. 2. 5.
[SQL/오답] 다중 조인 필터링과 조건부 집계 'IF(조건문,1,0)'로 취소율 계산하기 (LeetCode262 Hard) [리드코드] Hard|262. Trips and Users;https://leetcode.com/problems/trips-and-users/description/1. Problem2013-10-01부터 2013-10-03 사이의 일일 택시 호출 취소율을 구해야 한다.핵심 조건:차단되지 않은(Unbanned) 유저의 기록만 포함할 것 (클라이언트와 드라이버 둘 다 'No'여야 함).취소율 = (취소된 호출 수) / (차단되지 않은 유저의 전체 호출 수).결과를 소수점 둘째 자리에서 반올림할 것.2. Solution: 이중 조인을 이용한 클린 필터링Users 테이블을 두 번 조인하여 각각 클라이언트와 드라이버의 상태를 검증한다.3. Takeaway: 왜 이 풀이가 객관적으로 훌륭한가?JOIN을 통한 사전 .. 2026. 2. 5.
[SQL/오답] 날짜 데이터의 함정: JOIN 조건절(ON)에 DATEDIFF 사용하여 테이블 연결하기 (LeetCode197 Easy) 197. Rising Temperature; DATEDIFFhttps://leetcode.com/problems/rising-temperature/description/1. Problem전날(yesterday)보다 기온이 높은 날의 id를 찾아야 한다.핵심 과제: 단순히 '이전 행'을 비교하는 것이 아니라, **정확히 24시간 전(날짜 차이 1일)**인 기록과 기온을 비교해야 한다.2. Solution: Self Join과 날짜 차이 함수 활용원본 테이블(w1)을 오늘로, 조인할 테이블(w2)을 어제로 가정하고 DATEDIFF를 통해 관계를 맺는다.3. Takeaway: 왜 LAG 함수는 오답이 될 수 있는가? (객관적 분석)LAG()의 한계:LAG()는 현재 행을 기준으로 물리적으로 바로 위에 있는 행.. 2026. 2. 5.
[SQL/오답] 중복 데이터 삭제하기: Self Join 활용법 (LeetCode196 Easy) 196. Delete Duplicate Emails; DELETE, Self Join1. Problem중복된 이메일을 가진 행을 삭제하되, 가장 작은 id를 가진 행 하나만 남겨야 한다.핵심 과제:SELECT가 아닌 DELETE 문을 직접 작성할 것.동일 테이블을 참조하여 삭제 대상(더 큰 ID)을 식별할 것.2. Solution: Self Join을 이용한 타겟팅 삭제테이블을 두 개(p1, p2)로 가정한 뒤, 같은 이메일 중 ID가 더 큰 행만 골라 삭제한다.3. Takeaway: 왜 서브쿼리 방식은 실패하는가? (객관적 분석)암시적 조인 vs 명시적 조인:FROM Person p1, Person p2는 콤마(,)를 이용한 암시적 조인이다.현대적인 SQL 환경에서는 가독성을 위해 JOIN ... ON.. 2026. 2. 5.
[SQL/분석] 부서별 최고 연봉자 찾기: 윈도우 함수(RANK)와 다중 컬럼 IN 절의 조화 (LeetCode184 Medium) 184. Department Highest Salary: RANK, WHERE INhttps://leetcode.com/problems/department-highest-salary/description/1. Problem각 부서(Department)에서 가장 높은 급여(Salary)를 받는 직원의 정보를 출력해야 한다.핵심 과제: 한 부서 내에 최고 급여를 받는 사람이 여러 명(공동 1위)일 경우, 그들을 모두 출력해야 한다. 단순히 GROUP BY만으로는 해결하기 어려운 문제다.2. Solution: 두 가지 정석 접근법① 윈도우 함수 RANK() 활용 (모던 SQL 방식) 데이터에 순위를 먼저 매긴 후, 1등만 골라내는 방식이다. 가독성이 좋고 확장성이 뛰어나다.② 다중 컬럼 WHERE IN 활용 .. 2026. 2. 5.
SQL 윈도우 함수: 순위 함수 ROW_NUMBER, RANK, DENSE_RANK 1. 한눈에 보는 순위함수 차이점 동일한 점수(공동 순위)가 있을 때, 각각 어떻게 반응하는지가 핵심입니다.함수공동 순위 처리다음 순위 번호비유ROW_NUMBER()중복 없음 (무조건 고유 번호)연속됨 (1, 2, 3, 4...)냉혹한 선착순 번호표RANK()중복 허용 (공동 순위)건너뜀 (1, 2, 2, 4...)올림픽 메달 시스템DENSE_RANK()중복 허용 (공동 순위)연속됨 (1, 2, 2, 3...)빈틈없는 꽉 찬 순위 ORDER BY : 윈도우 함수 쓰면서 OVER(ORDER BY ...) 추가PARTITION BY: 그룹별 순위(예: 부서별 연봉 순위)를 매길 때는 PARTITION BY가 필수 2026. 2. 5.