본문 바로가기

Data/SQL

(14)
SQL 고급 : 윈도우 함수(분석 함수) - LAG(), LEAD() LAG(), LEAD() 함수란? LAG : 특정 로우(행)를 기준으로 이전(before) 로우(행)의 값을 반환 LEAD : 특정 로우(행)를 기준으로 다음(next) 로우(행)의 값을 반환 윈도우 함수(분석함수)인 LAG, LEAD 함수를 어떻게 활용하는지 사용자의 웹 행동 로그 데이터를 이용해 살펴보도록 하겠습니다. 아래와 같이 특정 사용자의 웹 행동 로그 데이터가 저장되어 있는 가상의 테이블이 있다고 가정해보겠습니다. user_id occurred_at event_type event_name location device 4 2014-05-20 9:31:30 engagement login India samsung galaxy s4 4 2014-05-20 9:31:55 engagement search..
SQL 고급 : PIVOT TABLE 아래의 왼쪽 그림과 같이 어느 백화점의 지역별 점포 리스트 현황 데이터가 있다고 가정해보겠습니다. 지역별로 점포 현황을 깔끔하게 정리해보려고 하는데요. 아래 오른쪽 그림과 같이 나타내주면 조금 더 직관적으로 지역별 점포가 몇개가 있고 어디에 있는지 이해하기 쉬울 것입니다. 이렇게 세로 기반의 테이블을 가로 기반의 테이블로 변경해주는 것을 Pivot 이라고 얘기 합니다. 오늘은 SQL 쿼리를 이용하여 Pivot Table을 만드는 방법에 대해 알아보겠습니다. 활용할 데이터는 위에 소개했던 데이터와 동일합니다. 우선 윈도우 함수인 순위 함수의 ROW_NUMBER()를 이용해서 먼저 각 지역별로 점포수가 몇 개인지 나열해보도록 하겠습니다. SELECT region, store, ROW_NUMBER() OVER..
SQL 고급 : 비등가 조인(Non-Equi Join) SQL을 어느 정도 공부해보신 분이라면 JOIN에 대해 많이 익숙해져 있으실텐데요. 일반적으로 조인 조건에는 동등 연산자(=)를 사용하지만 오늘은 테이블 간에 컬럼이 서로 정확하게 일치하지 않을 때 사용하는 비등가 조인(Non-Equi Join)에 대해서 알아보도록 하겠습니다. 우선 용어부터 생소한 비등가 조인(Non-Equi Join)에 대해서 간단하게 설명 후 어떻게 적용되는지 말씀 드리겠습니다. 비등가 조인(Non-Equi Join)이란? - 두 개이상의 테이블을 연결할 때 사용하는 조인 시에 테이블 간에 컬럼 값들이 서로 정확하게 일치하지 않는 경우 사용된다 - '=' 연산자가 아닌 다른 관계 연산자(>,>=, '2021-09-31' AND b.join_date < '2020-01-01' AND ..
SQL 고급 : 윈도우 함수(순위 함수) - RANK(), DENSE_RANK(), ROW_NUMBER() 오늘은 윈도우 함수 중 하나인 순위 함수를 어떻게 사용하는 지에 대해서 야구 데이터를 활용하여 함께 알아보도록 하겠습니다. 이를 위해 국내 프로야구 통산 홈런 개수가 300개가 넘는 선수들의 데이터를 가지고 홈런 순위를 계산하는 방법을 순위 함수를 통해 살펴보겠는데요. 이름 포지션 홈런 박경완 포수 314 이승엽 내야수 467 최정 내야수 403 이대호 내야수 351 장종훈 내야수 340 이호준 내야수 337 이범호 내야수 329 박병호 내야수 327 김태균 내야수 311 최형우 외야수 342 심정수 외야수 328 송지만 외야수 311 박재홍 외야수 300 양준혁 지명타자 351 1. RANK() 함수 첫 번째로 살펴볼 순위 함수는 RANK() 함수입니다. RANK() 함수는 순위 함수 중에서도 일반적으..
SQL 고급 : 3개 이상의 테이블을 JOIN 하기 현실에서 데이터 분석을 하다 보면 경우에 따라서 3~4개의 테이블을 조인해야 하는 상황이 생길 수 있습니다. 하지만 JOIN과 관련된 기본 문법을 익히거나 일반적인 SQL 문제 풀이에서 3~4개 테이블을 조인해야 하는 경우를 찾기가 쉽지 않은데요. 다행스럽게도 최근 새롭게 풀어본 SQL 문제를 통해 어떻게 3개 이상의 테이블을 JOIN할 수 있는지 보여드리려고 합니다. 역대 올림픽 경기와 관련된 데이터가 들어가 있는 테이블을 가지고 문제를 풀어볼텐데요. 우리가 해결해야 할 문제는 복수 국적으로 메달을 수상한 선수를 찾는 문제입니다. 예를 들면 쇼트트랙의 안현수(빅토르 안) 선수와 같이 올림픽에서 한국 국적과 러시아 국적으로 모두 메달을 딴 선수를 찾아야 한다는 것이죠. 문제 내용에 대해서는 저작권 이슈가..
SQL 실무 : DAU 및 신규, 복귀, 기존 유저 구별하기 오늘은 고객의 로그인 기록을 통해 데이터 분석을 해보도록 하겠습니다. 아래와 같이 가상의 모바일 게임 로그인 기록 데이터를 가지고 우리는 DAU(Daily Active User)의 숫자와 고객이 신규 유저인지, 기존 유저인지, 아니면 복귀 유저인지 파악해보고, 마지막으로 고객 세그먼트별 DAU를 계산한 뒤 시각화까지 해보겠습니다. 데이터는 보시는 것처럼 일자별로 게임에 로그인 한 유저 ID 정보를 보여주고 있는 가상의 데이터 입니다. 데이터는 8월과 9월, 약 두달 간의 데이터가 있다고 가정하도록 하겠습니다. log_date app_name user_id 2013-08-01 game-01 33754 2013-08-01 game-01 28598 2013-08-01 game-01 117 2013-08-01 ..
SQL 실무 : RFM 분석 RFM 분석은 Recency, Frequency, Monetary라는 3개의 앞 글자를 따와서 RFM 분석이라고 부르며, CRM 업무 시 고객을 분류하기 위해 사용하는 방법론입니다. RFM 분석을 통해 고객을 분류하게 되면 얼마나 우리 상품을 자주, 많이, 최근에 구매했는지 빠르게 파악할 수 있게 됩니다. - Recency : 최근 구매일자 (고객이 얼마나 최근에 우리 상품을 구매 했는지) - Frequency : 구매횟수 (고객이 특정 기간 동안 얼마나 자주 우리 상품을 구매 했는지) - Monetary : 구매금액 합계 (고객이 특정 기간 동안 우리 상품을 구매한 총액은 얼마인지) RFM 분석을 위해 사용할 데이터셋은 UCI 대학교의 Online Retail Data Set을 사용할 것입니다. 아래 ..
SQL 실무 : 이커머스 주문 데이터 분석하기 오늘은 가상의 이커머스 데이터를 활용해 여러 테이블을 join해보면서 이커머스 주문 데이터를 분석해보고자 합니다. 살펴볼 데이터는 아래와 같은 구조도를 가집니다. 주문정보가 들어가 있는 orders 테이블을 기준으로 주문ID, 고객ID, 사원ID 등을 join해 필요한 정보를 가지고 올 수 있는 다양한 테이블들이 있습니다. ■ e-commerce 데이터 스키마 그럼 해당 테이블 정보들을 통해 몇가지 이커머스 주문 데이터 분석을 해보도록 하겠습니다. 1. 상품(product) 카테고리별로 상품 수와 평균 가격대가 궁금한 경우 SELECT category, COUNT(*) AS quantity, AVG(list_price) AS avg_price FROM products GROUP BY category --..