시계열 데이터 - postgreSQL

Hunter Joe·2025년 2월 20일
0

시계열 데이터를 바탕으로 조회를 해야되서 예제로 다뤄봄

시계열 데이터란?

Time Series Data : 시계열 데이터
대표적으로 환율, 주가, 날씨 등에 쓰임

시간을 기준으로 데이터가 정렬되고
과거 데이터 분석에 용이

시계열 데이터를 저장할 때 고려할 점

  1. 인덱스 설정
  2. 데이터 삭제 전략
  3. 파티셔닝(대량 데이터 처리)
  4. 시계열 DB 사용 고려

1. 인덱스 설정 (timestamp, currency_pair(통화 쌍))

  • 빠른 조회 성능을 위한 timestamp currency_pair와 같은 인덱스 설정 할 것
CREATE INDEX idx_exchange_rates ON exchange_rates (currency_pair, timestamp DESC);

2. 데이터 삭제 전략

  • 오래된 데이터를 주기적으로 삭제 or 별도 테이블로 이동 or 압축해서 보관
DELETE FROM exchange_rates WHERE timestamp < NOW() - INTERVAL '1 year';

3. 파티셔닝

  • 데이터가 많아지면 timestamp기준으로 파티션을 하면 성능 향상에 도움이 됨
CREATE TABLE exchange_rates_y2024 PARTITION OF exchange_rates
FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');

4. 시계열 DB 사용 고려

  • 대표적으로 PostgreSQL의 TimescaleDB

단일 colum 구조

테이블 구조

CREATE TABLE exchange_rates (
  timestamp TIMESTAMP PRIMARY KEY,
  rate DECIMAL(10, 2) NOT NULL
);
  • timestamp → 기본 키
  • rate → 소수점 2자리까지 저장되는 환율(EX_)USD/KRW) 값

EX) 데이터

INSERT INTO exchange_rates (timestamp, rate) VALUES
  ('2024-02-19 12:00:00', 1320.50),
  ('2024-02-19 12:05:00', 1318.75),
  ('2024-02-19 12:10:00', 1321.25);

조회

SELECT * FROM exchange_rates ORDER BY timestamp DESC;

결과는 아래와 같음

 timestamp           | rate  
---------------------+--------
 2024-02-19 12:10:00 | 1321.25
 2024-02-19 12:05:00 | 1318.75
 2024-02-19 12:00:00 | 1320.50

JSON 형태

[
  {
    "timestamp": "2024-02-19T12:10:00.000Z",
    "rate": 1321.25
  },
  {
    "timestamp": "2024-02-19T12:05:00.000Z",
    "rate": 1318.75
  },
  {
    "timestamp": "2024-02-19T12:00:00.000Z",
    "rate": 1320.50
  }
]

다중 colum 일 때

테이블 구조

CREATE TABLE exchange_rates (
  id SERIAL PRIMARY KEY, // 고유 id 
  currency_pair VARCHAR(10) NOT NULL, // 통화 쌍
  timestamp TIMESTAMP NOT NULL, 
  rate DECIMAL(10,4) NOT NULL, //소수점 4자리
  UNIQUE (currency_pair, timestamp)
);

EX) 데이터

INSERT INTO exchange_rates (currency_pair, timestamp, rate) VALUES
  ('USD/KRW', '2024-02-19 12:00:00', 1320.50),
  ('USD/JPY', '2024-02-19 12:00:00', 150.25),
  ('USD/EUR', '2024-02-19 12:00:00', 0.9235),
  ('USD/GBP', '2024-02-19 12:00:00', 0.7852),
  ('USD/CNY', '2024-02-19 12:00:00', 7.1050);

저장된 데이터 조회

idcurrency_pairtimestamprate
1USD/KRW2024-02-19 12:00:001320.50
2USD/JPY2024-02-19 12:00:00150.25
3USD/EUR2024-02-19 12:00:000.9235
4USD/GBP2024-02-19 12:00:000.7852
5USD/CNY2024-02-19 12:00:007.1050

조회

  • 특정 통화 조회
SELECT * FROM exchange_rates
WHERE currency_pair = 'USD/KRW'
ORDER BY timestamp DESC
LIMIT 1;

  • 최신 환율 조회
SELECT DISTINCT ON (currency_pair) *
FROM exchange_rates
ORDER BY currency_pair, timestamp DESC;

JSON

[
  {
    "currency_pair": "USD/KRW",
    "timestamp": "2024-02-19T12:00:00.000Z",
    "rate": 1320.50
  },
  {
    "currency_pair": "USD/JPY",
    "timestamp": "2024-02-19T12:00:00.000Z",
    "rate": 150.25
  },
  {
    "currency_pair": "USD/EUR",
    "timestamp": "2024-02-19T12:00:00.000Z",
    "rate": 0.9235
  }
]
profile
Async FE 취업 준비중.. Await .. (취업완료 대기중) ..

0개의 댓글

관련 채용 정보