명령어/DB

[PostgreSQL] generate_series 테스트·시계열 데이터를 즉석에서 만든다

jykim23 2026. 8. 1. 19:49
반응형

설치·접속: PostgreSQL 설치와 접속

부제: 성능 테스트용 더미 행이나 "빠진 날짜 없는" 달력 축이 필요할 때, 별도 테이블 없이 SQL 한 줄로 연속된 값 집합을 뽑아 쓰고 싶을 때

-- 날짜를 하루 간격으로 펼친다: 빈 날 없는 시계열 축
SELECT d::date AS day
FROM generate_series('2026-01-01'::date, '2026-01-07'::date, '1 day') d;
    day     
------------
 2026-01-01
 2026-01-02
 2026-01-03
 2026-01-04
 2026-01-05
 2026-01-06
 2026-01-07
(7 rows)

generate_series는 시작·끝·간격을 주면 그 사이 값을 한 행씩 펼쳐 주는 집합 반환 함수다. 정수뿐 아니라 날짜·타임스탬프도 interval 간격으로 만들 수 있어, "실제 데이터가 없는 날짜까지 포함한 축"을 즉석에서 세운다. 리포트에서 주문이 0건인 날을 빈칸 없이 채우거나(달력 축과 LEFT JOIN), 인덱스·파티션 성능을 시험할 대량 더미 데이터를 만들 때 표준으로 쓴다. 테이블을 따로 만들 필요가 없어 임시 검증에 특히 가볍다.

이렇게도 쓴다

정수 시퀀스로 계산 결과를 함께 뽑는다.

SELECT g, g*g AS sq FROM generate_series(1,5) g;
--  1|1  2|4  3|9  4|16  5|25

 

간격(step)을 지정해 건너뛴다.

SELECT g FROM generate_series(0, 10, 2) g;   -- 0,2,4,6,8,10

 

시각 슬롯을 일정 간격으로 만든다(버킷 축). (조합: interval)

SELECT ts FROM generate_series(
  timestamp '2026-01-01 00:00', '2026-01-01 12:00', interval '3 hours') ts;

 

대량 더미 데이터를 만들어 테이블에 적재한다. (조합: CREATE TABLE AS)

CREATE TABLE m10_bulk AS
SELECT g AS id, (g % 100) AS cat, 'x' AS note
FROM generate_series(1, 500000) g;    -- 50만 행 즉석 생성

 

랜덤 값을 섞어 그럴듯한 테스트 데이터를 만든다. (조합: random)

SELECT g, (random()*100)::int AS score, now() - (g||' hours')::interval AS ts
FROM generate_series(1,10) g;

 

날짜 축과 실데이터를 LEFT JOIN해 빈 날을 0으로 채운다. (조합: LEFT JOIN)

SELECT d::date AS day, coalesce(count(o.id),0) AS orders
FROM generate_series('2026-01-01'::date,'2026-01-05'::date,'1 day') d
LEFT JOIN orders o ON o.ordered_at::date = d::date
GROUP BY d ORDER BY d;
반응형