연령별 구분 집계
시청률 분석에 많이 사용되는 연령별 구분을 집계해본다.
다음 표를 기반으로 사용자의 연령별 구분을 집계한다.
데이터는 다음과 같다.
사용자 나이 구하기
나이는 생일과 특정 날짜를 정수로 표현하고, 이 차이를 10,000으로 나누는 방법으로 간단히 구할 수 있다.
- 먼저 특정 날짜를 정수로 표현한다(기준 날짜)
- 사용자 생년월일(문자형)을 다음과 같이 정수 표현으로 반환한다.
WITH
mst_users_with_int_birth_date AS (
SELECT *
, 20170101 AS int_specific_date
,CAST(replace(substring(birth_date, 1, 10), '-', '') AS integer) AS int_birth_date
FROM mst_users
)
SELECT *
FROM mst_users_with_int_birth_date
3. 기준 날짜와 사용자 생년월일(정수형 변환 값)의 차이를 10000으로 나누고 내림하여 나이를 계산한다.
WITH
mst_users_with_int_birth_date AS (
SELECT *
, 20170101 AS int_specific_date
,CAST(replace(substring(birth_date, 1, 10), '-', '') AS integer) AS int_birth_date
FROM mst_users
)
, mst_users_with_age AS (
SELECT *
, floor((int_specific_date - int_birth_date)/10000) AS age
FROM mst_users_with_int_birth_date
)
SELECT
user_id, sex, birth_date, age
FROM mst_users_with_age
;
성별과 연령으로 연령별 구분 계산
- 위의 쿼리를 활용하여 mst_users_with_category 테이블을 작성한다.
- CASE WHEN으로 연령 구분을 20세 기준으로 먼저 한 다음, 20살 이상은 남/여(M or F) 구분이 되게 하였고
- 또 한 번 CASE WHEN을 사용하여 연령대에 따라 C, T, 1, 2와 같은 값을 매칭하였다.
- 그리고 이 두 값을 CONCAT()으로 연결한다.
WITH
mst_users_with_int_birth_date AS (
SELECT *
, 20170101 AS int_specific_date
,CAST(replace(substring(birth_date, 1, 10), '-', '') AS integer) AS int_birth_date
FROM mst_users
)
, mst_users_with_age AS (
SELECT *
, floor((int_specific_date - int_birth_date)/10000) AS age
FROM mst_users_with_int_birth_date
)
, mst_users_with_category AS (
SELECT user_id
, sex
, age
, concat(
CASE WHEN 20 <= age THEN sex
ELSE ''
END
, CASE WHEN age BETWEEN 4 AND 12 THEN 'C'
WHEN age BETWEEN 13 AND 19 THEN 'T'
WHEN age BETWEEN 20 AND 34 THEN '1'
WHEN age BETWEEN 35 AND 49 THEN '2'
WHEN age >= 50 THEN '3' END
) AS category
FROM mst_users_with_age
)
SELECT *
FROM mst_users_with_category
;
성별과 연령으로 연령별 구분 >> 각 그룹의 숫자 계산
- 상단 쿼리는 동일하고, category 별로 그룹화하여 count(1)을 하여 각 그룹에 속한 사용자수를 구할 수 있다.
WITH
mst_users_with_int_birth_date AS (
SELECT *
, 20170101 AS int_specific_date
,CAST(replace(substring(birth_date, 1, 10), '-', '') AS integer) AS int_birth_date
FROM mst_users
)
, mst_users_with_age AS (
SELECT *
, floor((int_specific_date - int_birth_date)/10000) AS age
FROM mst_users_with_int_birth_date
)
, mst_users_with_category AS (
SELECT user_id
, sex
, age
, concat(
CASE WHEN 20 <= age THEN sex
ELSE ''
END
, CASE WHEN age BETWEEN 4 AND 12 THEN 'C'
WHEN age BETWEEN 13 AND 19 THEN 'T'
WHEN age BETWEEN 20 AND 34 THEN '1'
WHEN age BETWEEN 35 AND 49 THEN '2'
WHEN age >= 50 THEN '3' END
) AS category
FROM mst_users_with_age
)
SELECT category
, count(1) AS user_count
FROM mst_users_with_category
GROUP BY category
;
728x90
'SQL > 실무 SQL' 카테고리의 다른 글
[PostgreSQL] 4. 사용자의 방문 빈도 집계하기 (0) | 2024.01.29 |
---|---|
[PostgreSQL] 3. 연령별 특징 추출하기 (0) | 2024.01.29 |
[PostgreSQL] 1. 사용자의 액션 수 집계 (0) | 2024.01.29 |
[PostgreSQL] 히스토그램용 데이터 가공(width_bucket) (0) | 2024.01.27 |
[PostgreSQL] 팬 차트로 매출 증가율 확인(FIRST VALUE 함수) (0) | 2024.01.27 |