개인 공부 공간/SQL(24)
-
[MySQL] Retention & Cohort Analysis
이번 포스팅에서는 MySQL 쿼리문을 이용하여 다양한 종류의 Retention을 산출하는 방법에 대해 설명해보려고 합니다. 이를 설명하기 이전에 우선 간략하게 Retention, 그리고 이와 밀접한 관계가 있는 Cohort Analysis에 대해 먼저 설명하겠습니다. 1. Retention 이란? 아마 고객 데이터 분석에 대해 관심이 있다면 Retention에 대해 들어본적이 있을꺼라고 생각합니다. Retention은 도메인을 막론하고 고객 분석을 진행할 때 대부분의 스타트업에서 매우 중요한 지표입니다. Retention을 통해 서비스를 지속적으로 이용하는 고객의 비중을 알 수 있습니다. 일반적으로 신규 고객을 유입시키는 비용보다 기존 고객을 유지하는 비용이 낮기때문에 기존 고객 유지와 관련되어 있는 R..
2022.02.16 -
[MySQL] GROUP_CONCAT
MySQL에서 GROUP BY를 사용하되 집계하지 않고 요소들을 리스트화 하는 방식에 대해 정리하려고 한다. 문법 자체는 매우 단순해서 아래 예시를 통해 설명하려고 한다. 예시 데이터는 따릉이 토이 프로젝트때 사용한 테이블 중 서울 공원들의 위치 정보를 담고 있는 park_location_table 테이블을 사용하였다. 위 테이블에서 행정구(city_gu) 별로 공원들을 리스트화 해서 집계하려고 한다. SELECT city_gu, GROUP_CONCAT(parkname) AS 'park_list' FROM park_location_table GROUP BY city_gu; 이와 같이 실행하면 아래와 같은 결과가 나온다. 항목들 사이의 구분 기준은 아래와 같이 구체적으로 설정 가능하다. SELECT cit..
2022.01.24 -
[MySQL] WITH AS
최근 HankerRank와 Leetcode에서 SQL 코딩 문제들을 풀던 도중 동일한 서브쿼리문을 여러곳에서 길게 작성하다 보니 코드 정리가 안되는 느낌을 받았다. 또한 가끔은 서브쿼리안에도 서브쿼리문을 작성해야할 경우가 있어서 가독성이 매우 떨어진다고 느꼈었다. 사용할 쿼리 결과를 미리 저장해두고 사용하는 방법이 없는지 찾아본 결과 MySQL에서 WITH AS 라는 아주 유용한 문법을 제공함을 알 수 있었다. 꼭 SQL 코딩 문제 풀이뿐 아니라 반복적으로 동일한 구문 결과를 사용할 일이 있을 경우 WITH AS 를 이용하여 반복적인 사용이 용이하게 가능하다. WITH AS 문법은 아래와 같다. WITH table_a AS ( 쿼리문 ) SELECT * FROM table_a; WITH 와 AS 사이에 ..
2022.01.10 -
[MySQL] != 처럼 JOIN 하기
최근 두 테이블 JOIN 시 아래 벤다이어그램과 같은 결과가 나오도록 쿼리문을 작성할 일이 있었다. 원래 어떻게 작성하면 위와 같은 결과가 나오는지 알고 있었는데.. 멍청하게도 JOIN ON 조건에 != 를 사용했다. 부끄럽지만 실수로 작성한 쿼리문을 공개하면 다음과 같다. SELECT a.*, b.* FROM table_a a LEFT JOIN table_b b ON a.key != b.key; 쿼리문 실행 후 아무리 기다려도 결과가 나오지 않아 이상함을 느낀 후 생각해보니 아주 잘못된 방식으로 쿼리문을 작성했음을 깨달았다. 위 쿼리문이 안되는 정확한 이유를 알기 위해 구글링 해보니 다음과 같은 이유로 위 쿼리문은 엄청난 연산 과정을 거친다고 한다. LEFT JOIN이 table a의 1,000,000..
2021.12.29 -
[MySQL] 6자리 생년월일을 나이로 변환하기
최근 6자리 생년월일(ex. 920923, 651201, 020816)을 나이로 변환해야 할 작업이 있었다. 이를 위해 우선 6자리 생년월일을 8자리로 바꾸는 작업이 필요하였다(920923 -> 19920923). 그 후 8자리 생년월일과 오늘 날짜의 차이를 이용해서 최종적으로 나이로 변환했었다. PostgreSQL의 경우 자체적으로 Age 함수를 제공하지만 내가 사용하는 MySQL의 경우 생년월일을 알아도 직접 구해야하는 번거로움이 존재한다. 생년월일 6자리 → 8자리 서비스를 이용하는 유저 중 0세와 100세 이상은 없을것이라 하는 아주 나이브하면서도 합리적인 가정을 통해 6자리 생년월일 중 앞 2자리가 21 보다 큰 경우는 모두 19를 붙여 주었고, 21 보다 작거나 같은 경우는 모두 20을 붙여 ..
2021.12.13 -
[MySQL] type 변환 함수(CAST & CONVERT)와 type의 종류
쿼리문을 작성할때 때로는 데이터의 type을 변환해야 하는 경우가 존재한다. 이런 경우 MySQL에서는 CAST와 CONVERT 함수를 이용하여 데이터 type 변환이 가능하다. 데이터 type 변환을 필요에 의해 하기 위해서는 MySQL에는 어떠한 데이터 type들이 존재하는지도 알아야 하기 때문에 이 포스트에서는 type 변환 방식과 type 종류들에 대해 모두 알아보려고 한다. CAST & CONVERT CAST를 이용한 type 변환 문법은 다음과 같다. CAST type 변환할 값 AS 변환할 type CONVERT를 이용한 type 변환 문법은 다음과 같다. CONVERT(type 변환할 값, 변환할 type) 이들을 각각 사용한 예시는 다음과 같다. 1. 현재 시간을 SIGNED type으로..
2021.12.12